From 0b59a54a78ee22be83fe249c724c19ebd7d26ede Mon Sep 17 00:00:00 2001 From: Rod S Date: Fri, 25 Mar 2022 12:41:45 -0700 Subject: Update FontTools to 4.31.2 to gain access to iterSubTables. Needed to facilitate implementation of additional emoji font validation. Ran tools/external_updater/updater.sh update fonttools Bug: 226676748 Test: will run presubmit Test: m fontchain_lint Change-Id: I1207eea8394848bd2ef5040de9aebc8f940b1d96 --- .github/workflows/test.yml | 12 +- .gitignore | 1 + Doc/docs-requirements.txt | 7 +- Doc/source/cffLib/index.rst | 40 - Doc/source/colorLib/index.rst | 6 - Doc/source/conf.py | 11 +- Doc/source/designspaceLib/readme.rst | 4 +- Doc/source/developer.rst | 1 + Doc/source/index.rst | 5 +- Doc/source/misc/index.rst | 1 - Doc/source/misc/plistlib.rst | 3 - Doc/source/misc/py23.rst | 8 - Doc/source/optional.rst | 6 +- Doc/source/otlLib/index.rst | 73 +- Doc/source/pens/freetypePen.rst | 8 + Doc/source/pens/index.rst | 1 + Doc/source/tfmLib.rst | 8 + Doc/source/ttLib/index.rst | 27 +- Doc/source/ttLib/tables.rst | 881 +- Doc/source/ttLib/tables/B_A_S_E_.rst | 8 + Doc/source/ttLib/tables/C_B_D_T_.rst | 8 + Doc/source/ttLib/tables/C_B_L_C_.rst | 8 + Doc/source/ttLib/tables/C_F_F_.rst | 8 + Doc/source/ttLib/tables/C_F_F__2.rst | 8 + Doc/source/ttLib/tables/C_O_L_R_.rst | 7 + Doc/source/ttLib/tables/C_P_A_L_.rst | 8 + Doc/source/ttLib/tables/D_S_I_G_.rst | 8 + Doc/source/ttLib/tables/E_B_D_T_.rst | 18 + Doc/source/ttLib/tables/E_B_L_C_.rst | 18 + Doc/source/ttLib/tables/F_F_T_M_.rst | 9 + Doc/source/ttLib/tables/F__e_a_t.rst | 9 + Doc/source/ttLib/tables/G_D_E_F_.rst | 8 + Doc/source/ttLib/tables/G_M_A_P_.rst | 8 + Doc/source/ttLib/tables/G_P_K_G_.rst | 8 + Doc/source/ttLib/tables/G_P_O_S_.rst | 8 + Doc/source/ttLib/tables/G_S_U_B_.rst | 8 + Doc/source/ttLib/tables/G__l_a_t.rst | 8 + Doc/source/ttLib/tables/G__l_o_c.rst | 8 + Doc/source/ttLib/tables/H_V_A_R_.rst | 7 + Doc/source/ttLib/tables/J_S_T_F_.rst | 7 + Doc/source/ttLib/tables/L_T_S_H_.rst | 8 + Doc/source/ttLib/tables/M_A_T_H_.rst | 7 + Doc/source/ttLib/tables/M_E_T_A_.rst | 7 + Doc/source/ttLib/tables/M_V_A_R_.rst | 7 + Doc/source/ttLib/tables/O_S_2f_2.rst | 7 + Doc/source/ttLib/tables/S_I_N_G_.rst | 7 + Doc/source/ttLib/tables/S_T_A_T_.rst | 7 + Doc/source/ttLib/tables/S_V_G_.rst | 8 + Doc/source/ttLib/tables/S__i_l_f.rst | 7 + Doc/source/ttLib/tables/S__i_l_l.rst | 7 + Doc/source/ttLib/tables/T_T_F_A_.rst | 8 + Doc/source/ttLib/tables/VTT_related.rst | 99 + Doc/source/ttLib/tables/V_D_M_X_.rst | 7 + Doc/source/ttLib/tables/V_O_R_G_.rst | 8 + Doc/source/ttLib/tables/V_V_A_R_.rst | 8 + Doc/source/ttLib/tables/_a_n_k_r.rst | 7 + Doc/source/ttLib/tables/_a_v_a_r.rst | 8 + Doc/source/ttLib/tables/_b_s_l_n.rst | 7 + Doc/source/ttLib/tables/_c_i_d_g.rst | 7 + Doc/source/ttLib/tables/_c_m_a_p.rst | 6 + Doc/source/ttLib/tables/_c_v_a_r.rst | 17 + Doc/source/ttLib/tables/_c_v_t.rst | 8 + Doc/source/ttLib/tables/_f_e_a_t.rst | 7 + Doc/source/ttLib/tables/_f_p_g_m.rst | 7 + Doc/source/ttLib/tables/_f_v_a_r.rst | 8 + Doc/source/ttLib/tables/_g_a_s_p.rst | 8 + Doc/source/ttLib/tables/_g_c_i_d.rst | 7 + Doc/source/ttLib/tables/_g_l_y_f.rst | 11 + Doc/source/ttLib/tables/_g_v_a_r.rst | 16 + Doc/source/ttLib/tables/_h_d_m_x.rst | 8 + Doc/source/ttLib/tables/_h_e_a_d.rst | 8 + Doc/source/ttLib/tables/_h_h_e_a.rst | 8 + Doc/source/ttLib/tables/_h_m_t_x.rst | 8 + Doc/source/ttLib/tables/_k_e_r_n.rst | 8 + Doc/source/ttLib/tables/_l_c_a_r.rst | 8 + Doc/source/ttLib/tables/_l_o_c_a.rst | 8 + Doc/source/ttLib/tables/_l_t_a_g.rst | 8 + Doc/source/ttLib/tables/_m_a_x_p.rst | 8 + Doc/source/ttLib/tables/_m_e_t_a.rst | 8 + Doc/source/ttLib/tables/_m_o_r_t.rst | 9 + Doc/source/ttLib/tables/_m_o_r_x.rst | 8 + Doc/source/ttLib/tables/_n_a_m_e.rst | 8 + Doc/source/ttLib/tables/_o_p_b_d.rst | 8 + Doc/source/ttLib/tables/_p_o_s_t.rst | 8 + Doc/source/ttLib/tables/_p_r_e_p.rst | 9 + Doc/source/ttLib/tables/_p_r_o_p.rst | 8 + Doc/source/ttLib/tables/_s_b_i_x.rst | 25 + Doc/source/ttLib/tables/_t_r_a_k.rst | 8 + Doc/source/ttLib/tables/_v_h_e_a.rst | 8 + Doc/source/ttLib/tables/_v_m_t_x.rst | 8 + Doc/source/ttLib/ttFont.rst | 16 +- Doc/source/varLib/index.rst | 37 +- Doc/source/voltLib.rst | 13 +- Lib/fontTools/__init__.py | 2 +- Lib/fontTools/agl.py | 2 +- Lib/fontTools/cffLib/__init__.py | 111 +- Lib/fontTools/colorLib/builder.py | 207 +- Lib/fontTools/colorLib/geometry.py | 10 +- Lib/fontTools/colorLib/table_builder.py | 61 +- Lib/fontTools/colorLib/unbuilder.py | 16 +- Lib/fontTools/cu2qu/cli.py | 10 +- Lib/fontTools/designspaceLib/__init__.py | 38 +- Lib/fontTools/feaLib/__main__.py | 5 +- Lib/fontTools/feaLib/ast.py | 111 +- Lib/fontTools/feaLib/builder.py | 493 +- Lib/fontTools/feaLib/parser.py | 203 +- Lib/fontTools/feaLib/variableScalar.py | 97 + Lib/fontTools/fontBuilder.py | 16 +- Lib/fontTools/help.py | 3 +- Lib/fontTools/merge.py | 1205 - Lib/fontTools/merge/__init__.py | 200 + Lib/fontTools/merge/__main__.py | 6 + Lib/fontTools/merge/base.py | 76 + Lib/fontTools/merge/cmap.py | 129 + Lib/fontTools/merge/layout.py | 466 + Lib/fontTools/merge/options.py | 85 + Lib/fontTools/merge/tables.py | 311 + Lib/fontTools/merge/unicode.py | 65 + Lib/fontTools/merge/util.py | 131 + Lib/fontTools/misc/arrayTools.py | 2 +- Lib/fontTools/misc/bezierTools.py | 22 +- Lib/fontTools/misc/eexec.py | 2 +- Lib/fontTools/misc/etree.py | 6 +- Lib/fontTools/misc/fixedTools.py | 36 +- Lib/fontTools/misc/intTools.py | 35 +- Lib/fontTools/misc/macCreatorType.py | 4 +- Lib/fontTools/misc/macRes.py | 2 +- Lib/fontTools/misc/plistlib/__init__.py | 4 +- Lib/fontTools/misc/psCharStrings.py | 2 +- Lib/fontTools/misc/psLib.py | 3 +- Lib/fontTools/misc/py23.py | 58 +- Lib/fontTools/misc/roundTools.py | 47 + Lib/fontTools/misc/sstruct.py | 15 +- Lib/fontTools/misc/testTools.py | 17 +- Lib/fontTools/misc/textTools.py | 54 +- Lib/fontTools/misc/transform.py | 93 +- Lib/fontTools/misc/xmlReader.py | 11 +- Lib/fontTools/misc/xmlWriter.py | 4 +- Lib/fontTools/otlLib/builder.py | 129 +- Lib/fontTools/otlLib/optimize/__init__.py | 68 + Lib/fontTools/otlLib/optimize/__main__.py | 6 + Lib/fontTools/otlLib/optimize/gpos.py | 439 + Lib/fontTools/pens/basePen.py | 14 +- Lib/fontTools/pens/boundsPen.py | 8 +- Lib/fontTools/pens/cu2quPen.py | 29 +- Lib/fontTools/pens/freetypePen.py | 458 + Lib/fontTools/pens/pointPen.py | 89 +- Lib/fontTools/pens/recordingPen.py | 96 +- Lib/fontTools/pens/reportLabPen.py | 2 +- Lib/fontTools/pens/svgPathPen.py | 49 +- Lib/fontTools/pens/transformPen.py | 2 +- Lib/fontTools/pens/ttGlyphPen.py | 283 +- Lib/fontTools/subset/__init__.py | 890 +- Lib/fontTools/subset/cff.py | 146 +- Lib/fontTools/subset/svg.py | 248 + Lib/fontTools/subset/util.py | 25 + Lib/fontTools/svgLib/path/__init__.py | 3 +- Lib/fontTools/t1Lib/__init__.py | 219 +- Lib/fontTools/tfmLib.py | 460 + Lib/fontTools/ttLib/__init__.py | 43 +- Lib/fontTools/ttLib/removeOverlaps.py | 68 +- Lib/fontTools/ttLib/sfnt.py | 9 +- Lib/fontTools/ttLib/tables/C_B_D_T_.py | 2 +- Lib/fontTools/ttLib/tables/C_O_L_R_.py | 6 +- Lib/fontTools/ttLib/tables/C_P_A_L_.py | 3 +- Lib/fontTools/ttLib/tables/D_S_I_G_.py | 3 +- Lib/fontTools/ttLib/tables/DefaultTable.py | 2 +- Lib/fontTools/ttLib/tables/E_B_D_T_.py | 3 +- Lib/fontTools/ttLib/tables/E_B_L_C_.py | 3 +- Lib/fontTools/ttLib/tables/F__e_a_t.py | 6 + Lib/fontTools/ttLib/tables/G_M_A_P_.py | 3 +- Lib/fontTools/ttLib/tables/G_P_K_G_.py | 3 +- Lib/fontTools/ttLib/tables/M_E_T_A_.py | 3 +- Lib/fontTools/ttLib/tables/S_I_N_G_.py | 3 +- Lib/fontTools/ttLib/tables/S_V_G_.py | 311 +- Lib/fontTools/ttLib/tables/S__i_l_f.py | 3 +- Lib/fontTools/ttLib/tables/T_S_I_V_.py | 2 +- Lib/fontTools/ttLib/tables/T_S_I__1.py | 2 +- Lib/fontTools/ttLib/tables/TupleVariation.py | 351 +- Lib/fontTools/ttLib/tables/V_O_R_G_.py | 11 +- Lib/fontTools/ttLib/tables/_a_n_k_r.py | 15 +- Lib/fontTools/ttLib/tables/_a_v_a_r.py | 24 +- Lib/fontTools/ttLib/tables/_c_i_d_g.py | 25 +- Lib/fontTools/ttLib/tables/_c_m_a_p.py | 129 +- Lib/fontTools/ttLib/tables/_c_v_a_r.py | 4 +- Lib/fontTools/ttLib/tables/_f_e_a_t.py | 6 + Lib/fontTools/ttLib/tables/_f_v_a_r.py | 3 +- Lib/fontTools/ttLib/tables/_g_l_y_f.py | 575 +- Lib/fontTools/ttLib/tables/_g_v_a_r.py | 23 +- Lib/fontTools/ttLib/tables/_h_d_m_x.py | 2 +- Lib/fontTools/ttLib/tables/_l_t_a_g.py | 3 +- Lib/fontTools/ttLib/tables/_m_e_t_a.py | 3 +- Lib/fontTools/ttLib/tables/_n_a_m_e.py | 41 +- Lib/fontTools/ttLib/tables/_p_o_s_t.py | 38 +- Lib/fontTools/ttLib/tables/_t_r_a_k.py | 3 +- Lib/fontTools/ttLib/tables/asciiTable.py | 2 +- Lib/fontTools/ttLib/tables/otBase.py | 215 +- Lib/fontTools/ttLib/tables/otConverters.py | 266 +- Lib/fontTools/ttLib/tables/otData.py | 303 +- Lib/fontTools/ttLib/tables/otTables.py | 438 +- Lib/fontTools/ttLib/tables/ttProgram.py | 3 +- Lib/fontTools/ttLib/ttCollection.py | 18 +- Lib/fontTools/ttLib/ttFont.py | 318 +- Lib/fontTools/ttLib/woff2.py | 3 +- Lib/fontTools/ttx.py | 206 +- Lib/fontTools/ufoLib/__init__.py | 4 +- Lib/fontTools/ufoLib/filenames.py | 92 +- Lib/fontTools/ufoLib/glifLib.py | 155 +- Lib/fontTools/ufoLib/plistlib.py | 2 +- Lib/fontTools/unicodedata/Blocks.py | 778 +- Lib/fontTools/unicodedata/OTTags.py | 4 + Lib/fontTools/unicodedata/ScriptExtensions.py | 58 +- Lib/fontTools/unicodedata/Scripts.py | 511 +- Lib/fontTools/unicodedata/__init__.py | 18 +- Lib/fontTools/varLib/__init__.py | 50 +- Lib/fontTools/varLib/builder.py | 71 +- Lib/fontTools/varLib/cff.py | 37 +- Lib/fontTools/varLib/errors.py | 34 +- Lib/fontTools/varLib/featureVars.py | 104 +- Lib/fontTools/varLib/instancer/__init__.py | 71 +- Lib/fontTools/varLib/merger.py | 78 +- Lib/fontTools/varLib/models.py | 938 +- Lib/fontTools/varLib/mutator.py | 10 +- Lib/fontTools/varLib/varStore.py | 31 +- METADATA | 12 +- NEWS.rst | 300 +- README.rst | 61 +- Snippets/README.md | 1 + Snippets/checksum.py | 4 +- Snippets/compact_gpos.py | 144 + Snippets/svg2glif.py | 2 +- Tests/colorLib/builder_test.py | 850 +- Tests/colorLib/unbuilder_test.py | 122 +- Tests/designspaceLib/designspace_test.py | 2 - Tests/feaLib/builder_test.py | 531 +- Tests/feaLib/data/PairPosSubtable.fea | 4 - Tests/feaLib/data/bug2276.fea | 11 + Tests/feaLib/data/bug2276.ttx | 59 + Tests/feaLib/data/delete_glyph.fea | 4 + Tests/feaLib/data/delete_glyph.ttx | 15 +- Tests/feaLib/data/variable_conditionset.fea | 13 + Tests/feaLib/data/variable_conditionset.ttx | 67 + Tests/feaLib/data/variable_scalar_anchor.fea | 4 + Tests/feaLib/data/variable_scalar_anchor.ttx | 101 + Tests/feaLib/data/variable_scalar_valuerecord.fea | 5 + Tests/feaLib/data/variable_scalar_valuerecord.ttx | 104 + Tests/feaLib/lexer_test.py | 2 +- Tests/feaLib/parser_test.py | 944 +- Tests/merge/data/CFFFont1.ttx | 23445 +++++++++++++++ Tests/merge/data/CFFFont2.ttx | 6682 +++++ Tests/merge/data/CFFFont_expected.ttx | 30063 +++++++++++++++++++ Tests/merge/merge_test.py | 237 + Tests/merge_test.py | 169 - Tests/misc/bezierTools_test.py | 20 +- Tests/misc/plistlib_test.py | 2 +- Tests/misc/transform_test.py | 8 + Tests/misc/xmlReader_test.py | 2 +- Tests/misc/xmlWriter_test.py | 19 +- Tests/mtiLib/mti_test.py | 6 +- Tests/otlLib/builder_test.py | 662 +- Tests/otlLib/optimize_test.py | 175 + Tests/pens/data/test_even_odd_fill.pgm | Bin 0 -> 2513 bytes Tests/pens/data/test_non_zero_fill.pgm | Bin 0 -> 2513 bytes Tests/pens/data/test_rotate.pgm | Bin 0 -> 1309 bytes Tests/pens/data/test_skew.pgm | Bin 0 -> 1263 bytes Tests/pens/freetypePen_test.py | 235 + Tests/pens/ttGlyphPen_test.py | 381 +- Tests/subset/data/BungeeColor-Regular.ttx | 438 + .../GPOS_SinglePos_no_value_issue_2312.subset.ttx | 234 + .../data/GPOS_SinglePos_no_value_issue_2312.ttx | 689 + Tests/subset/subset_test.py | 223 +- Tests/subset/svg_test.py | 556 + Tests/svgLib/path/path_test.py | 2 +- Tests/t1Lib/data/TestT1-ellipsis-hinted.pfa | 73 + Tests/t1Lib/t1Lib_test.py | 94 +- Tests/tfmLib/data/cmex10.tfm | Bin 0 -> 992 bytes Tests/tfmLib/data/cmr10.tfm | Bin 0 -> 1296 bytes Tests/tfmLib/data/cmsy10.tfm | Bin 0 -> 1124 bytes Tests/tfmLib/data/dummy-space.tfm | Bin 0 -> 152 bytes Tests/tfmLib/tfmLib_test.py | 90 + Tests/ttLib/data/TestVGID-Regular.otf | Bin 0 -> 31992 bytes Tests/ttLib/data/TestVGID-Regular.ttx | 18418 ++++++++++++ Tests/ttLib/removeOverlaps_test.py | 51 + Tests/ttLib/tables/C_O_L_R_test.py | 441 +- Tests/ttLib/tables/M_V_A_R_test.py | 61 +- Tests/ttLib/tables/S_V_G__test.py | 131 + Tests/ttLib/tables/T_S_I__1_test.py | 2 +- Tests/ttLib/tables/TupleVariation_test.py | 80 +- Tests/ttLib/tables/_g_l_y_f_test.py | 22 +- Tests/ttLib/tables/_l_t_a_g_test.py | 5 +- Tests/ttLib/tables/_m_o_r_x_test.py | 3 +- Tests/ttLib/tables/_n_a_m_e_test.py | 112 +- Tests/ttLib/tables/otTables_test.py | 254 +- Tests/ttLib/tables/tables_test.py | 2 +- Tests/ttLib/tables/ttProgram_test.py | 2 +- Tests/ttLib/ttCollection_test.py | 27 + Tests/ttLib/ttFont_test.py | 166 + Tests/ttLib/woff2_test.py | 2 +- Tests/ttx/ttx_test.py | 14 - Tests/ufoLib/UFOZ_test.py | 2 +- Tests/ufoLib/filenames_test.py | 10 + Tests/ufoLib/glifLib_test.py | 2 + Tests/unicodedata_test.py | 6 +- Tests/varLib/builder_test.py | 23 + .../instancer/data/PartialInstancerTest4-VF.ttx | 463 + Tests/varLib/instancer/data/SinglePos.ttx | 249 + .../test_results/SinglePos-VF-instance-280,18.ttx | 96 + Tests/varLib/instancer/instancer_test.py | 45 +- Tests/varLib/interpolate_layout_test.py | 7 +- Tests/varLib/mutator_test.py | 7 +- Tests/varLib/varLib_test.py | 7 +- Tests/varLib/varStore_test.py | 82 + mypy.ini | 2 +- requirements.txt | 17 +- setup.cfg | 9 +- setup.py | 10 +- tox.ini | 4 +- 317 files changed, 97164 insertions(+), 8097 deletions(-) delete mode 100644 Doc/source/misc/py23.rst create mode 100644 Doc/source/pens/freetypePen.rst create mode 100644 Doc/source/tfmLib.rst create mode 100644 Doc/source/ttLib/tables/B_A_S_E_.rst create mode 100644 Doc/source/ttLib/tables/C_B_D_T_.rst create mode 100644 Doc/source/ttLib/tables/C_B_L_C_.rst create mode 100644 Doc/source/ttLib/tables/C_F_F_.rst create mode 100644 Doc/source/ttLib/tables/C_F_F__2.rst create mode 100644 Doc/source/ttLib/tables/C_O_L_R_.rst create mode 100644 Doc/source/ttLib/tables/C_P_A_L_.rst create mode 100644 Doc/source/ttLib/tables/D_S_I_G_.rst create mode 100644 Doc/source/ttLib/tables/E_B_D_T_.rst create mode 100644 Doc/source/ttLib/tables/E_B_L_C_.rst create mode 100644 Doc/source/ttLib/tables/F_F_T_M_.rst create mode 100644 Doc/source/ttLib/tables/F__e_a_t.rst create mode 100644 Doc/source/ttLib/tables/G_D_E_F_.rst create mode 100644 Doc/source/ttLib/tables/G_M_A_P_.rst create mode 100644 Doc/source/ttLib/tables/G_P_K_G_.rst create mode 100644 Doc/source/ttLib/tables/G_P_O_S_.rst create mode 100644 Doc/source/ttLib/tables/G_S_U_B_.rst create mode 100644 Doc/source/ttLib/tables/G__l_a_t.rst create mode 100644 Doc/source/ttLib/tables/G__l_o_c.rst create mode 100644 Doc/source/ttLib/tables/H_V_A_R_.rst create mode 100644 Doc/source/ttLib/tables/J_S_T_F_.rst create mode 100644 Doc/source/ttLib/tables/L_T_S_H_.rst create mode 100644 Doc/source/ttLib/tables/M_A_T_H_.rst create mode 100644 Doc/source/ttLib/tables/M_E_T_A_.rst create mode 100644 Doc/source/ttLib/tables/M_V_A_R_.rst create mode 100644 Doc/source/ttLib/tables/O_S_2f_2.rst create mode 100644 Doc/source/ttLib/tables/S_I_N_G_.rst create mode 100644 Doc/source/ttLib/tables/S_T_A_T_.rst create mode 100644 Doc/source/ttLib/tables/S_V_G_.rst create mode 100644 Doc/source/ttLib/tables/S__i_l_f.rst create mode 100644 Doc/source/ttLib/tables/S__i_l_l.rst create mode 100644 Doc/source/ttLib/tables/T_T_F_A_.rst create mode 100644 Doc/source/ttLib/tables/VTT_related.rst create mode 100644 Doc/source/ttLib/tables/V_D_M_X_.rst create mode 100644 Doc/source/ttLib/tables/V_O_R_G_.rst create mode 100644 Doc/source/ttLib/tables/V_V_A_R_.rst create mode 100644 Doc/source/ttLib/tables/_a_n_k_r.rst create mode 100644 Doc/source/ttLib/tables/_a_v_a_r.rst create mode 100644 Doc/source/ttLib/tables/_b_s_l_n.rst create mode 100644 Doc/source/ttLib/tables/_c_i_d_g.rst create mode 100644 Doc/source/ttLib/tables/_c_m_a_p.rst create mode 100644 Doc/source/ttLib/tables/_c_v_a_r.rst create mode 100644 Doc/source/ttLib/tables/_c_v_t.rst create mode 100644 Doc/source/ttLib/tables/_f_e_a_t.rst create mode 100644 Doc/source/ttLib/tables/_f_p_g_m.rst create mode 100644 Doc/source/ttLib/tables/_f_v_a_r.rst create mode 100644 Doc/source/ttLib/tables/_g_a_s_p.rst create mode 100644 Doc/source/ttLib/tables/_g_c_i_d.rst create mode 100644 Doc/source/ttLib/tables/_g_l_y_f.rst create mode 100644 Doc/source/ttLib/tables/_g_v_a_r.rst create mode 100644 Doc/source/ttLib/tables/_h_d_m_x.rst create mode 100644 Doc/source/ttLib/tables/_h_e_a_d.rst create mode 100644 Doc/source/ttLib/tables/_h_h_e_a.rst create mode 100644 Doc/source/ttLib/tables/_h_m_t_x.rst create mode 100644 Doc/source/ttLib/tables/_k_e_r_n.rst create mode 100644 Doc/source/ttLib/tables/_l_c_a_r.rst create mode 100644 Doc/source/ttLib/tables/_l_o_c_a.rst create mode 100644 Doc/source/ttLib/tables/_l_t_a_g.rst create mode 100644 Doc/source/ttLib/tables/_m_a_x_p.rst create mode 100644 Doc/source/ttLib/tables/_m_e_t_a.rst create mode 100644 Doc/source/ttLib/tables/_m_o_r_t.rst create mode 100644 Doc/source/ttLib/tables/_m_o_r_x.rst create mode 100644 Doc/source/ttLib/tables/_n_a_m_e.rst create mode 100644 Doc/source/ttLib/tables/_o_p_b_d.rst create mode 100644 Doc/source/ttLib/tables/_p_o_s_t.rst create mode 100644 Doc/source/ttLib/tables/_p_r_e_p.rst create mode 100644 Doc/source/ttLib/tables/_p_r_o_p.rst create mode 100644 Doc/source/ttLib/tables/_s_b_i_x.rst create mode 100644 Doc/source/ttLib/tables/_t_r_a_k.rst create mode 100644 Doc/source/ttLib/tables/_v_h_e_a.rst create mode 100644 Doc/source/ttLib/tables/_v_m_t_x.rst create mode 100644 Lib/fontTools/feaLib/variableScalar.py delete mode 100644 Lib/fontTools/merge.py create mode 100644 Lib/fontTools/merge/__init__.py create mode 100644 Lib/fontTools/merge/__main__.py create mode 100644 Lib/fontTools/merge/base.py create mode 100644 Lib/fontTools/merge/cmap.py create mode 100644 Lib/fontTools/merge/layout.py create mode 100644 Lib/fontTools/merge/options.py create mode 100644 Lib/fontTools/merge/tables.py create mode 100644 Lib/fontTools/merge/unicode.py create mode 100644 Lib/fontTools/merge/util.py create mode 100644 Lib/fontTools/otlLib/optimize/__init__.py create mode 100644 Lib/fontTools/otlLib/optimize/__main__.py create mode 100644 Lib/fontTools/otlLib/optimize/gpos.py create mode 100644 Lib/fontTools/pens/freetypePen.py create mode 100644 Lib/fontTools/subset/svg.py create mode 100644 Lib/fontTools/subset/util.py create mode 100644 Lib/fontTools/tfmLib.py create mode 100644 Snippets/compact_gpos.py create mode 100644 Tests/feaLib/data/bug2276.fea create mode 100644 Tests/feaLib/data/bug2276.ttx create mode 100644 Tests/feaLib/data/variable_conditionset.fea create mode 100644 Tests/feaLib/data/variable_conditionset.ttx create mode 100644 Tests/feaLib/data/variable_scalar_anchor.fea create mode 100644 Tests/feaLib/data/variable_scalar_anchor.ttx create mode 100644 Tests/feaLib/data/variable_scalar_valuerecord.fea create mode 100644 Tests/feaLib/data/variable_scalar_valuerecord.ttx create mode 100644 Tests/merge/data/CFFFont1.ttx create mode 100644 Tests/merge/data/CFFFont2.ttx create mode 100644 Tests/merge/data/CFFFont_expected.ttx create mode 100644 Tests/merge/merge_test.py delete mode 100644 Tests/merge_test.py create mode 100644 Tests/otlLib/optimize_test.py create mode 100644 Tests/pens/data/test_even_odd_fill.pgm create mode 100644 Tests/pens/data/test_non_zero_fill.pgm create mode 100644 Tests/pens/data/test_rotate.pgm create mode 100644 Tests/pens/data/test_skew.pgm create mode 100644 Tests/pens/freetypePen_test.py create mode 100644 Tests/subset/data/BungeeColor-Regular.ttx create mode 100644 Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.subset.ttx create mode 100644 Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.ttx create mode 100644 Tests/subset/svg_test.py create mode 100644 Tests/t1Lib/data/TestT1-ellipsis-hinted.pfa create mode 100644 Tests/tfmLib/data/cmex10.tfm create mode 100644 Tests/tfmLib/data/cmr10.tfm create mode 100644 Tests/tfmLib/data/cmsy10.tfm create mode 100644 Tests/tfmLib/data/dummy-space.tfm create mode 100644 Tests/tfmLib/tfmLib_test.py create mode 100644 Tests/ttLib/data/TestVGID-Regular.otf create mode 100644 Tests/ttLib/data/TestVGID-Regular.ttx create mode 100644 Tests/ttLib/removeOverlaps_test.py create mode 100644 Tests/ttLib/tables/S_V_G__test.py create mode 100644 Tests/ttLib/ttCollection_test.py create mode 100644 Tests/varLib/instancer/data/PartialInstancerTest4-VF.ttx create mode 100644 Tests/varLib/instancer/data/SinglePos.ttx create mode 100644 Tests/varLib/instancer/data/test_results/SinglePos-VF-instance-280,18.ttx create mode 100644 Tests/varLib/varStore_test.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 89d668d0..fb314ef8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,17 +27,17 @@ jobs: if: "! contains(toJSON(github.event.commits.*.message), '[skip ci]')" strategy: matrix: - python-version: [3.6, 3.7, 3.8, 3.9] + python-version: [3.7, 3.8, 3.9] platform: [ubuntu-latest, macos-latest, windows-latest] exclude: # Only test on the oldest and latest supported stable Python on macOS and Windows. - platform: macos-latest python-version: 3.7 - platform: macos-latest - python-version: 3.8 + python-version: 3.9 - platform: windows-latest python-version: 3.7 - platform: windows-latest - python-version: 3.8 + python-version: 3.9 steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} @@ -55,7 +55,7 @@ jobs: coverage combine coverage xml - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v2 with: file: coverage.xml flags: unittests @@ -70,7 +70,7 @@ jobs: - name: Set up Python 3.x uses: actions/setup-python@v2 with: - python-version: "3.x" + python-version: 3.9 - name: Install packages run: pip install tox - name: Run Tox @@ -84,7 +84,7 @@ jobs: - name: Set up Python pypy3 uses: actions/setup-python@v2 with: - python-version: "pypy3" + python-version: "pypy-3.7" - name: Install packages run: pip install tox - name: Run Tox diff --git a/.gitignore b/.gitignore index eba633ed..9c564fd5 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ dist/ *.egg-info/ *.egg MANIFEST +.idea # Installer logs pip-log.txt diff --git a/Doc/docs-requirements.txt b/Doc/docs-requirements.txt index c62c8d1e..5016e340 100644 --- a/Doc/docs-requirements.txt +++ b/Doc/docs-requirements.txt @@ -1,3 +1,4 @@ -sphinx==3.3.1 -sphinx_rtd_theme==0.5.0 -reportlab==3.5.55 +sphinx==4.3.2 +sphinx_rtd_theme==1.0.0 +reportlab==3.6.5 +freetype-py==2.2.0 diff --git a/Doc/source/cffLib/index.rst b/Doc/source/cffLib/index.rst index 281a0b12..4a40f92f 100644 --- a/Doc/source/cffLib/index.rst +++ b/Doc/source/cffLib/index.rst @@ -11,43 +11,3 @@ This package also contains two modules for manipulating CFF format glyphs: specializer width - -.. autoclass:: fontTools.cffLib.CFFFontSet - :inherited-members: - :members: - -.. autoclass:: fontTools.cffLib.TopDict - :members: - -.. autoclass:: fontTools.cffLib.CharStrings - :members: - -.. autoclass:: fontTools.cffLib.Index - :members: - -.. autoclass:: fontTools.cffLib.GlobalSubrsIndex - :members: - -.. autoclass:: fontTools.cffLib.TopDictIndex - :members: - -.. autoclass:: fontTools.cffLib.CFFWriter - :members: - -.. autoclass:: fontTools.cffLib.IndexCompiler - :members: - -.. autoclass:: fontTools.cffLib.TopDictIndexCompiler - :members: - -.. autoclass:: fontTools.cffLib.FDArrayIndexCompiler - :members: - -.. autoclass:: fontTools.cffLib.GlobalSubrsCompiler - :members: - -.. autoclass:: fontTools.cffLib.SubrsCompiler - :members: - -.. autoclass:: fontTools.cffLib.CharStringsCompiler - :members: diff --git a/Doc/source/colorLib/index.rst b/Doc/source/colorLib/index.rst index d4eb9f83..5a9bf8a1 100644 --- a/Doc/source/colorLib/index.rst +++ b/Doc/source/colorLib/index.rst @@ -3,9 +3,3 @@ colorLib.builder: Build COLR/CPAL tables from scratch ##################################################### .. automodule:: fontTools.colorLib.builder - :members: buildCPAL, buildCOLR, populateCOLRv0 - -.. autoclass:: fontTools.colorLib.builder.ColorPaletteType - :inherited-members: - :members: - :undoc-members: diff --git a/Doc/source/conf.py b/Doc/source/conf.py index 82a5d579..b95119db 100644 --- a/Doc/source/conf.py +++ b/Doc/source/conf.py @@ -30,9 +30,14 @@ needs_sphinx = "1.3" # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ["sphinx.ext.autodoc", "sphinx.ext.viewcode", "sphinx.ext.napoleon", "sphinx.ext.coverage"] +extensions = ["sphinx.ext.autodoc", "sphinx.ext.viewcode", "sphinx.ext.napoleon", "sphinx.ext.coverage", "sphinx.ext.autosectionlabel"] -autodoc_mock_imports = ["gtk"] +autodoc_mock_imports = ["gtk", "reportlab"] + +autodoc_default_options = { + 'members': True, + 'inherited-members': True +} # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] @@ -99,7 +104,7 @@ html_theme_options = {"display_version": False} # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] +# html_static_path = ["_static"] html_favicon = "assets/img/favicon.ico" diff --git a/Doc/source/designspaceLib/readme.rst b/Doc/source/designspaceLib/readme.rst index c5757a6e..b9ba85a6 100644 --- a/Doc/source/designspaceLib/readme.rst +++ b/Doc/source/designspaceLib/readme.rst @@ -95,7 +95,7 @@ Class Methods - +.. _source-descriptor-object: SourceDescriptor object ======================= @@ -883,7 +883,7 @@ Attributes is not important for compiling variable fonts. 5.1.1 conditionset element -======================= +========================== - Child element of ``rule`` - Contains one or more ``condition`` elements. diff --git a/Doc/source/developer.rst b/Doc/source/developer.rst index 3e259f0e..dc4d425c 100644 --- a/Doc/source/developer.rst +++ b/Doc/source/developer.rst @@ -1,3 +1,4 @@ +:orphan: .. _developerinfo: .. image:: ../../Icons/FontToolsIconGreenCircle.png :width: 200px diff --git a/Doc/source/index.rst b/Doc/source/index.rst index 2162cc13..784834d8 100644 --- a/Doc/source/index.rst +++ b/Doc/source/index.rst @@ -61,7 +61,7 @@ Libraries --------- The main library you will want to access when using fontTools for font -engineering is likely to be :py:mod:`fontTools.ttLib`, which is the package +engineering is likely to be :py:mod:`fontTools.ttLib.ttFont`, which is the module for handling TrueType/OpenType fonts. However, there are many other libraries in the fontTools suite: @@ -79,6 +79,8 @@ libraries in the fontTools suite: - :py:mod:`fontTools.subset`: OpenType font subsetting and optimization - :py:mod:`fontTools.svgLib.path`: Library for drawing SVG paths onto glyphs - :py:mod:`fontTools.t1Lib`: Tools for PostScript Type 1 fonts (Python2 only) +- :py:mod:`fontTools.tfmLib`: Module for reading TFM files +- :py:mod:`fontTools.ttLib`: Module for reading/writing OpenType and Truetype fonts - :py:mod:`fontTools.ttx`: Module for converting between OTF and XML representation - :py:mod:`fontTools.ufoLib`: Module for reading and writing UFO files - :py:mod:`fontTools.unicodedata`: Convert between Unicode and OpenType script information @@ -130,6 +132,7 @@ Table of Contents subset/index svgLib/index t1Lib + tfmLib ttLib/index ttx ufoLib/index diff --git a/Doc/source/misc/index.rst b/Doc/source/misc/index.rst index bd7db09e..003c48a5 100644 --- a/Doc/source/misc/index.rst +++ b/Doc/source/misc/index.rst @@ -25,7 +25,6 @@ utilities by fontTools, but some of which may be more generally useful. psCharStrings psLib psOperators - py23 sstruct symfont testTools diff --git a/Doc/source/misc/plistlib.rst b/Doc/source/misc/plistlib.rst index 68570967..7409aa22 100644 --- a/Doc/source/misc/plistlib.rst +++ b/Doc/source/misc/plistlib.rst @@ -4,6 +4,3 @@ plistlib: Tools for handling .plist files .. automodule:: fontTools.misc.plistlib :members: totree, fromtree, load, loads, dump, dumps - -.. autoclass:: fontTools.misc.plistlib.Data - :members: diff --git a/Doc/source/misc/py23.rst b/Doc/source/misc/py23.rst deleted file mode 100644 index 49a76bf1..00000000 --- a/Doc/source/misc/py23.rst +++ /dev/null @@ -1,8 +0,0 @@ -#### -py23 -#### - -.. automodule:: fontTools.misc.py23 - :inherited-members: - :members: - :undoc-members: diff --git a/Doc/source/optional.rst b/Doc/source/optional.rst index 09376a26..0ac22bfd 100644 --- a/Doc/source/optional.rst +++ b/Doc/source/optional.rst @@ -1,3 +1,5 @@ +:orphan: + Optional Dependencies ===================== @@ -57,8 +59,8 @@ with ``ttx`` we use the ``unicodedata`` module in the Standard Library. The version included in there varies between different Python versions. To use the latest available data, you can install: -* `unicodedata2 `__: ``unicodedata`` backport for Python 2.7 - and 3.x updated to the latest Unicode version 12.0. Note this is not necessary if you use Python 3.8 +* `unicodedata2 `__: ``unicodedata`` backport for Python + 3.x updated to the latest Unicode version 14.0. Note this is not necessary if you use Python 3.11 as the latter already comes with an up-to-date ``unicodedata``. *Extra:* ``unicode`` diff --git a/Doc/source/otlLib/index.rst b/Doc/source/otlLib/index.rst index 1984914c..272db73a 100644 --- a/Doc/source/otlLib/index.rst +++ b/Doc/source/otlLib/index.rst @@ -11,16 +11,31 @@ lookups, coverage tables and so on. High-level OpenType Layout Lookup Builders ------------------------------------------ -.. automodule:: fontTools.otlLib.builder - :members: AlternateSubstBuilder, ChainContextPosBuilder, ChainContextSubstBuilder, LigatureSubstBuilder, MultipleSubstBuilder, CursivePosBuilder, MarkBasePosBuilder, MarkLigPosBuilder, MarkMarkPosBuilder, ReverseChainSingleSubstBuilder, SingleSubstBuilder, ClassPairPosSubtableBuilder, PairPosBuilder, SinglePosBuilder - :member-order: bysource +.. currentmodule:: fontTools.otlLib.builder + +.. autoclass:: AlternateSubstBuilder +.. autoclass:: ChainContextPosBuilder +.. autoclass:: ChainContextSubstBuilder +.. autoclass:: LigatureSubstBuilder +.. autoclass:: MultipleSubstBuilder +.. autoclass:: CursivePosBuilder +.. autoclass:: MarkBasePosBuilder +.. autoclass:: MarkLigPosBuilder +.. autoclass:: MarkMarkPosBuilder +.. autoclass:: ReverseChainSingleSubstBuilder +.. autoclass:: SingleSubstBuilder +.. autoclass:: ClassPairPosSubtableBuilder +.. autoclass:: PairPosBuilder +.. autoclass:: SinglePosBuilder -------------------------------------- Common OpenType Layout Data Structures -------------------------------------- -.. automodule:: fontTools.otlLib.builder - :members: buildCoverage, buildLookup +.. currentmodule:: fontTools.otlLib.builder + +.. autofunction:: buildCoverage +.. autofunction:: buildLookup ------------------------------------ Low-level GSUB Table Lookup Builders @@ -29,8 +44,12 @@ Low-level GSUB Table Lookup Builders These functions deal with the "simple" lookup types. See above for classes to help build more complex lookups (contextual and chaining lookups). -.. automodule:: fontTools.otlLib.builder - :members: buildSingleSubstSubtable, buildMultipleSubstSubtable, buildAlternateSubstSubtable, buildLigatureSubstSubtable +.. currentmodule:: fontTools.otlLib.builder + +.. autofunction:: buildSingleSubstSubtable +.. autofunction:: buildMultipleSubstSubtable +.. autofunction:: buildAlternateSubstSubtable +.. autofunction:: buildLigatureSubstSubtable -------------------------- GPOS Shared Table Builders @@ -40,9 +59,13 @@ The functions help build the `GPOS shared tables >> -You must subclass from :py:mod:`fontTools.ttLib.tables.DefaultTable.DefaultTable`. It provides some default -behavior, as well as a constructor method (__init__) that you don't need to -override. +ttProgram: TrueType bytecode assembler/disassembler +--------------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.ttProgram + :inherited-members: + :members: + :undoc-members: + +Contributing your own table convertors +-------------------------------------- + +To add support for a new font table that fontTools does not currently implement, +you must subclass from :py:mod:`fontTools.ttLib.tables.DefaultTable.DefaultTable`. +It provides some default behavior, as well as a constructor method (``__init__``) +that you don't need to override. Your converter should minimally provide two methods:: @@ -92,774 +176,15 @@ If you want to support TTX import/export as well, you need to provide two additional methods:: - def toXML(self, writer, ttFont): - # XXX - - def fromXML(self, (name, attrs, content), ttFont): - # XXX - + def toXML(self, writer, ttFont): + # XXX + def fromXML(self, (name, attrs, content), ttFont): + # XXX .. automodule:: fontTools.ttLib.tables :inherited-members: :members: :undoc-members: -_a_n_k_r --------- - -.. automodule:: fontTools.ttLib.tables._a_n_k_r - :inherited-members: - :members: - :undoc-members: - -_a_v_a_r --------- - -.. automodule:: fontTools.ttLib.tables._a_v_a_r - :inherited-members: - :members: - :undoc-members: - -_b_s_l_n --------- - -.. automodule:: fontTools.ttLib.tables._b_s_l_n - :inherited-members: - :members: - :undoc-members: - -_c_i_d_g --------- - -.. automodule:: fontTools.ttLib.tables._c_i_d_g - :inherited-members: - :members: - :undoc-members: - -_c_m_a_p --------- - -.. automodule:: fontTools.ttLib.tables._c_m_a_p - :inherited-members: - :members: - :undoc-members: - -_c_v_a_r --------- - -.. automodule:: fontTools.ttLib.tables._c_v_a_r - :inherited-members: - :members: - :undoc-members: - -_c_v_t ------- - -.. automodule:: fontTools.ttLib.tables._c_v_t - :inherited-members: - :members: - :undoc-members: - -_f_e_a_t --------- - -.. automodule:: fontTools.ttLib.tables._f_e_a_t - :inherited-members: - :members: - :undoc-members: - -_f_p_g_m --------- - -.. automodule:: fontTools.ttLib.tables._f_p_g_m - :inherited-members: - :members: - :undoc-members: - -_f_v_a_r --------- - -.. automodule:: fontTools.ttLib.tables._f_v_a_r - :inherited-members: - :members: - :undoc-members: - -_g_a_s_p --------- - -.. automodule:: fontTools.ttLib.tables._g_a_s_p - :inherited-members: - :members: - :undoc-members: - - -_g_c_i_d --------- - -.. automodule:: fontTools.ttLib.tables._g_c_i_d - :inherited-members: - :members: - :undoc-members: - -_g_l_y_f --------- - -.. automodule:: fontTools.ttLib.tables._g_l_y_f - :inherited-members: - :members: - :undoc-members: - -_g_v_a_r --------- - -.. automodule:: fontTools.ttLib.tables._g_v_a_r - :inherited-members: - :members: - :undoc-members: - -_h_d_m_x --------- - -.. automodule:: fontTools.ttLib.tables._h_d_m_x - :inherited-members: - :members: - :undoc-members: - -_h_e_a_d --------- - -.. automodule:: fontTools.ttLib.tables._h_e_a_d - :inherited-members: - :members: - :undoc-members: - -_h_h_e_a --------- - -.. automodule:: fontTools.ttLib.tables._h_h_e_a - :inherited-members: - :members: - :undoc-members: - -_h_m_t_x --------- - -.. automodule:: fontTools.ttLib.tables._h_m_t_x - :inherited-members: - :members: - :undoc-members: - -_k_e_r_n --------- - -.. automodule:: fontTools.ttLib.tables._k_e_r_n - :inherited-members: - :members: - :undoc-members: - -_l_c_a_r --------- - -.. automodule:: fontTools.ttLib.tables._l_c_a_r - :inherited-members: - :members: - :undoc-members: - -_l_o_c_a --------- - -.. automodule:: fontTools.ttLib.tables._l_o_c_a - :inherited-members: - :members: - :undoc-members: - -_l_t_a_g --------- - -.. automodule:: fontTools.ttLib.tables._l_t_a_g - :inherited-members: - :members: - :undoc-members: - -_m_a_x_p --------- - -.. automodule:: fontTools.ttLib.tables._m_a_x_p - :inherited-members: - :members: - :undoc-members: - -_m_e_t_a --------- - -.. automodule:: fontTools.ttLib.tables._m_e_t_a - :inherited-members: - :members: - :undoc-members: - -_m_o_r_t --------- - -.. automodule:: fontTools.ttLib.tables._m_o_r_t - :inherited-members: - :members: - :undoc-members: - - -_m_o_r_x --------- - -.. automodule:: fontTools.ttLib.tables._m_o_r_x - :inherited-members: - :members: - :undoc-members: - -_n_a_m_e --------- - -.. automodule:: fontTools.ttLib.tables._n_a_m_e - :inherited-members: - :members: - :undoc-members: - -_o_p_b_d --------- - -.. automodule:: fontTools.ttLib.tables._o_p_b_d - :inherited-members: - :members: - :undoc-members: - -_p_o_s_t --------- - -.. automodule:: fontTools.ttLib.tables._p_o_s_t - :inherited-members: - :members: - :undoc-members: - -_p_r_e_p --------- - -.. automodule:: fontTools.ttLib.tables._p_r_e_p - :inherited-members: - :members: - :undoc-members: - - -_p_r_o_p --------- - -.. automodule:: fontTools.ttLib.tables._p_r_o_p - :inherited-members: - :members: - :undoc-members: - -_s_b_i_x --------- - -.. automodule:: fontTools.ttLib.tables._s_b_i_x - :inherited-members: - :members: - :undoc-members: - -_t_r_a_k --------- - -.. automodule:: fontTools.ttLib.tables._t_r_a_k - :inherited-members: - :members: - :undoc-members: - -_v_h_e_a --------- - -.. automodule:: fontTools.ttLib.tables._v_h_e_a - :inherited-members: - :members: - :undoc-members: - -_v_m_t_x --------- - -.. automodule:: fontTools.ttLib.tables._v_m_t_x - :inherited-members: - :members: - :undoc-members: - -asciiTable ----------- - -.. automodule:: fontTools.ttLib.tables.asciiTable - :inherited-members: - :members: - :undoc-members: - -B_A_S_E_ --------- - -.. automodule:: fontTools.ttLib.tables.B_A_S_E_ - :inherited-members: - :members: - :undoc-members: - -BitmapGlyphMetrics ------------------- - -.. automodule:: fontTools.ttLib.tables.BitmapGlyphMetrics - :inherited-members: - :members: - :undoc-members: - -C_B_D_T_ --------- - -.. automodule:: fontTools.ttLib.tables.C_B_D_T_ - :inherited-members: - :members: - :undoc-members: - -C_B_L_C_ --------- - -.. automodule:: fontTools.ttLib.tables.C_B_L_C_ - :inherited-members: - :members: - :undoc-members: - -C_F_F_ ------- - -.. automodule:: fontTools.ttLib.tables.C_F_F_ - :inherited-members: - :members: - :undoc-members: - -C_F_F__2 --------- - -.. automodule:: fontTools.ttLib.tables.C_F_F__2 - :inherited-members: - :members: - :undoc-members: - -C_O_L_R_ --------- - -.. automodule:: fontTools.ttLib.tables.C_O_L_R_ - :inherited-members: - :members: - :undoc-members: - -C_P_A_L_ --------- - -.. automodule:: fontTools.ttLib.tables.C_P_A_L_ - :inherited-members: - :members: - :undoc-members: - -D_S_I_G_ --------- - -.. automodule:: fontTools.ttLib.tables.D_S_I_G_ - :inherited-members: - :members: - :undoc-members: - -DefaultTable ------------- - -.. automodule:: fontTools.ttLib.tables.DefaultTable - :inherited-members: - :members: - :undoc-members: - -E_B_D_T_ --------- - -.. automodule:: fontTools.ttLib.tables.E_B_D_T_ - :inherited-members: - :members: - :undoc-members: - -E_B_L_C_ --------- - -.. automodule:: fontTools.ttLib.tables.E_B_L_C_ - :inherited-members: - :members: - :undoc-members: - -F__e_a_t --------- - -.. automodule:: fontTools.ttLib.tables.F__e_a_t - :inherited-members: - :members: - :undoc-members: - - -F_F_T_M_ --------- - -.. automodule:: fontTools.ttLib.tables.F_F_T_M_ - :inherited-members: - :members: - :undoc-members: - - -G__l_a_t --------- - -.. automodule:: fontTools.ttLib.tables.G__l_a_t - :inherited-members: - :members: - :undoc-members: - -G__l_o_c --------- - -.. automodule:: fontTools.ttLib.tables.G__l_o_c - :inherited-members: - :members: - :undoc-members: - -G_D_E_F_ --------- - -.. automodule:: fontTools.ttLib.tables.G_D_E_F_ - :inherited-members: - :members: - :undoc-members: - -G_M_A_P_ --------- - -.. automodule:: fontTools.ttLib.tables.G_M_A_P_ - :inherited-members: - :members: - :undoc-members: - -G_P_K_G_ --------- - -.. automodule:: fontTools.ttLib.tables.G_P_K_G_ - :inherited-members: - :members: - :undoc-members: - -G_P_O_S_ --------- - -.. automodule:: fontTools.ttLib.tables.G_P_O_S_ - :inherited-members: - :members: - :undoc-members: - -G_S_U_B_ --------- - -.. automodule:: fontTools.ttLib.tables.G_S_U_B_ - :inherited-members: - :members: - :undoc-members: - -grUtils -------- - -.. automodule:: fontTools.ttLib.tables.grUtils - :inherited-members: - :members: - :undoc-members: - -H_V_A_R_ --------- - -.. automodule:: fontTools.ttLib.tables.H_V_A_R_ - :inherited-members: - :members: - :undoc-members: - -J_S_T_F_ --------- - -.. automodule:: fontTools.ttLib.tables.J_S_T_F_ - :inherited-members: - :members: - :undoc-members: - -L_T_S_H_ --------- - -.. automodule:: fontTools.ttLib.tables.L_T_S_H_ - :inherited-members: - :members: - :undoc-members: - -M_A_T_H_ --------- - -.. automodule:: fontTools.ttLib.tables.M_A_T_H_ - :inherited-members: - :members: - :undoc-members: - -M_E_T_A_ --------- - -.. automodule:: fontTools.ttLib.tables.M_E_T_A_ - :inherited-members: - :members: - :undoc-members: - -M_V_A_R_ --------- - -.. automodule:: fontTools.ttLib.tables.M_V_A_R_ - :inherited-members: - :members: - :undoc-members: - -O_S_2f_2 --------- - -.. automodule:: fontTools.ttLib.tables.O_S_2f_2 - :inherited-members: - :members: - :undoc-members: - -otBase ------- - -.. automodule:: fontTools.ttLib.tables.otBase - :inherited-members: - :members: - :undoc-members: - -otConverters ------------- - -.. automodule:: fontTools.ttLib.tables.otConverters - :inherited-members: - :members: - :undoc-members: - -otData ------- - -.. automodule:: fontTools.ttLib.tables.otData - :inherited-members: - :members: - :undoc-members: - -otTables --------- - -.. automodule:: fontTools.ttLib.tables.otTables - :inherited-members: - :members: - :undoc-members: - -S__i_l_f --------- - -.. automodule:: fontTools.ttLib.tables.S__i_l_f - :inherited-members: - :members: - :undoc-members: - -S__i_l_l --------- - -.. automodule:: fontTools.ttLib.tables.S__i_l_l - :inherited-members: - :members: - :undoc-members: - -S_I_N_G_ --------- - -.. automodule:: fontTools.ttLib.tables.S_I_N_G_ - :inherited-members: - :members: - :undoc-members: - -S_T_A_T_ --------- - -.. automodule:: fontTools.ttLib.tables.S_T_A_T_ - :inherited-members: - :members: - :undoc-members: - -S_V_G_ ------- - -.. automodule:: fontTools.ttLib.tables.S_V_G_ - :inherited-members: - :members: - :undoc-members: - -sbixGlyph ---------- - -.. automodule:: fontTools.ttLib.tables.sbixGlyph - :inherited-members: - :members: - :undoc-members: - -sbixStrike ----------- - -.. automodule:: fontTools.ttLib.tables.sbixStrike - :inherited-members: - :members: - :undoc-members: - -T_S_I__0 --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I__0 - :inherited-members: - :members: - :undoc-members: - -T_S_I__1 --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I__1 - :inherited-members: - :members: - :undoc-members: - -T_S_I__2 --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I__2 - :inherited-members: - :members: - :undoc-members: - -T_S_I__3 --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I__3 - :inherited-members: - :members: - :undoc-members: - -T_S_I__5 --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I__5 - :inherited-members: - :members: - :undoc-members: - -T_S_I_B_ --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I_B_ - :inherited-members: - :members: - :undoc-members: - -T_S_I_C_ --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I_C_ - :inherited-members: - :members: - :undoc-members: - -T_S_I_D_ --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I_D_ - :inherited-members: - :members: - :undoc-members: - -T_S_I_J_ --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I_J_ - :inherited-members: - :members: - :undoc-members: - -T_S_I_P_ --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I_P_ - :inherited-members: - :members: - :undoc-members: - -T_S_I_S_ --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I_S_ - :inherited-members: - :members: - :undoc-members: - -T_S_I_V_ --------- - -.. automodule:: fontTools.ttLib.tables.T_S_I_V_ - :inherited-members: - :members: - :undoc-members: - -T_T_F_A_ --------- - -.. automodule:: fontTools.ttLib.tables.T_T_F_A_ - :inherited-members: - :members: - :undoc-members: - -ttProgram ---------- - -.. automodule:: fontTools.ttLib.tables.ttProgram - :inherited-members: - :members: - :undoc-members: - -TupleVariation --------------- - -.. automodule:: fontTools.ttLib.tables.TupleVariation - :inherited-members: - :members: - :undoc-members: - -V_D_M_X_ --------- - -.. automodule:: fontTools.ttLib.tables.V_D_M_X_ - :inherited-members: - :members: - :undoc-members: - -V_O_R_G_ --------- - -.. automodule:: fontTools.ttLib.tables.V_O_R_G_ - :inherited-members: - :members: - :undoc-members: - -V_V_A_R_ --------- - -.. automodule:: fontTools.ttLib.tables.V_V_A_R_ - :inherited-members: - :members: - :undoc-members: - diff --git a/Doc/source/ttLib/tables/B_A_S_E_.rst b/Doc/source/ttLib/tables/B_A_S_E_.rst new file mode 100644 index 00000000..bc0c132a --- /dev/null +++ b/Doc/source/ttLib/tables/B_A_S_E_.rst @@ -0,0 +1,8 @@ +``BASE``: Baseline Table +------------------------ + +.. automodule:: fontTools.ttLib.tables.B_A_S_E_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/C_B_D_T_.rst b/Doc/source/ttLib/tables/C_B_D_T_.rst new file mode 100644 index 00000000..602ffb6f --- /dev/null +++ b/Doc/source/ttLib/tables/C_B_D_T_.rst @@ -0,0 +1,8 @@ +``CBDT``: Color Bitmap Data Table +--------------------------------- + +.. automodule:: fontTools.ttLib.tables.C_B_D_T_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/C_B_L_C_.rst b/Doc/source/ttLib/tables/C_B_L_C_.rst new file mode 100644 index 00000000..00c5ac40 --- /dev/null +++ b/Doc/source/ttLib/tables/C_B_L_C_.rst @@ -0,0 +1,8 @@ +``CBLC``: Color Bitmap Location Table +------------------------------------- + +.. automodule:: fontTools.ttLib.tables.C_B_L_C_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/C_F_F_.rst b/Doc/source/ttLib/tables/C_F_F_.rst new file mode 100644 index 00000000..92c2e5bb --- /dev/null +++ b/Doc/source/ttLib/tables/C_F_F_.rst @@ -0,0 +1,8 @@ +``CFF``: Compact Font Format Table +---------------------------------- + +.. automodule:: fontTools.ttLib.tables.C_F_F_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/C_F_F__2.rst b/Doc/source/ttLib/tables/C_F_F__2.rst new file mode 100644 index 00000000..946c246a --- /dev/null +++ b/Doc/source/ttLib/tables/C_F_F__2.rst @@ -0,0 +1,8 @@ +``CFF2``: Compact Font Format (CFF) Version 2 +--------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.C_F_F__2 + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/C_O_L_R_.rst b/Doc/source/ttLib/tables/C_O_L_R_.rst new file mode 100644 index 00000000..11c30d53 --- /dev/null +++ b/Doc/source/ttLib/tables/C_O_L_R_.rst @@ -0,0 +1,7 @@ +``COLR``: Color Table +--------------------- + +.. automodule:: fontTools.ttLib.tables.C_O_L_R_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/C_P_A_L_.rst b/Doc/source/ttLib/tables/C_P_A_L_.rst new file mode 100644 index 00000000..4ade11a7 --- /dev/null +++ b/Doc/source/ttLib/tables/C_P_A_L_.rst @@ -0,0 +1,8 @@ +``CPAL``: Color Palette Table +----------------------------- + +.. automodule:: fontTools.ttLib.tables.C_P_A_L_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/D_S_I_G_.rst b/Doc/source/ttLib/tables/D_S_I_G_.rst new file mode 100644 index 00000000..a3256bb0 --- /dev/null +++ b/Doc/source/ttLib/tables/D_S_I_G_.rst @@ -0,0 +1,8 @@ +``DSIG``: Digital Signature Table +--------------------------------- + +.. automodule:: fontTools.ttLib.tables.D_S_I_G_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/E_B_D_T_.rst b/Doc/source/ttLib/tables/E_B_D_T_.rst new file mode 100644 index 00000000..8cd6e8d4 --- /dev/null +++ b/Doc/source/ttLib/tables/E_B_D_T_.rst @@ -0,0 +1,18 @@ +``EBDT``: Embedded Bitmap Data Table +------------------------------------ + +.. automodule:: fontTools.ttLib.tables.E_B_D_T_ + :inherited-members: + :members: + :undoc-members: + + +BitmapGlyphMetrics +^^^^^^^^^^^^^^^^^^ + +.. automodule:: fontTools.ttLib.tables.BitmapGlyphMetrics + :noindex: + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/E_B_L_C_.rst b/Doc/source/ttLib/tables/E_B_L_C_.rst new file mode 100644 index 00000000..aa8a7401 --- /dev/null +++ b/Doc/source/ttLib/tables/E_B_L_C_.rst @@ -0,0 +1,18 @@ +``EBLC``: Embedded Bitmap Location Table +---------------------------------------- + +.. automodule:: fontTools.ttLib.tables.E_B_L_C_ + :inherited-members: + :members: + :undoc-members: + + +BitmapGlyphMetrics +^^^^^^^^^^^^^^^^^^ + +.. automodule:: fontTools.ttLib.tables.BitmapGlyphMetrics + :noindex: + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/F_F_T_M_.rst b/Doc/source/ttLib/tables/F_F_T_M_.rst new file mode 100644 index 00000000..901ac50e --- /dev/null +++ b/Doc/source/ttLib/tables/F_F_T_M_.rst @@ -0,0 +1,9 @@ +``FFTM``: FontForge Time Stamp Table +------------------------------------ + +.. automodule:: fontTools.ttLib.tables.F_F_T_M_ + :inherited-members: + :members: + :undoc-members: + + diff --git a/Doc/source/ttLib/tables/F__e_a_t.rst b/Doc/source/ttLib/tables/F__e_a_t.rst new file mode 100644 index 00000000..7c53026c --- /dev/null +++ b/Doc/source/ttLib/tables/F__e_a_t.rst @@ -0,0 +1,9 @@ +``Feat``: Graphite Feature Table +-------------------------------- + +.. automodule:: fontTools.ttLib.tables.F__e_a_t + :inherited-members: + :members: + :undoc-members: + + diff --git a/Doc/source/ttLib/tables/G_D_E_F_.rst b/Doc/source/ttLib/tables/G_D_E_F_.rst new file mode 100644 index 00000000..b0e95be5 --- /dev/null +++ b/Doc/source/ttLib/tables/G_D_E_F_.rst @@ -0,0 +1,8 @@ +``GDEF``: Glyph Definition Table +-------------------------------- + +.. automodule:: fontTools.ttLib.tables.G_D_E_F_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/G_M_A_P_.rst b/Doc/source/ttLib/tables/G_M_A_P_.rst new file mode 100644 index 00000000..4d1ec5b5 --- /dev/null +++ b/Doc/source/ttLib/tables/G_M_A_P_.rst @@ -0,0 +1,8 @@ +``GMAP``: SING Glyphlet Summary Table +------------------------------------- + +.. automodule:: fontTools.ttLib.tables.G_M_A_P_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/G_P_K_G_.rst b/Doc/source/ttLib/tables/G_P_K_G_.rst new file mode 100644 index 00000000..1cf66c85 --- /dev/null +++ b/Doc/source/ttLib/tables/G_P_K_G_.rst @@ -0,0 +1,8 @@ +``GPKG``: SING Glyphlet Wrapper Table +------------------------------------- + +.. automodule:: fontTools.ttLib.tables.G_P_K_G_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/G_P_O_S_.rst b/Doc/source/ttLib/tables/G_P_O_S_.rst new file mode 100644 index 00000000..a36c5b32 --- /dev/null +++ b/Doc/source/ttLib/tables/G_P_O_S_.rst @@ -0,0 +1,8 @@ +``GPOS``: Glyph Positioning Table +--------------------------------- + +.. automodule:: fontTools.ttLib.tables.G_P_O_S_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/G_S_U_B_.rst b/Doc/source/ttLib/tables/G_S_U_B_.rst new file mode 100644 index 00000000..f9ac6c7b --- /dev/null +++ b/Doc/source/ttLib/tables/G_S_U_B_.rst @@ -0,0 +1,8 @@ +``GSUB``: Glyph Substitution Table +---------------------------------- + +.. automodule:: fontTools.ttLib.tables.G_S_U_B_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/G__l_a_t.rst b/Doc/source/ttLib/tables/G__l_a_t.rst new file mode 100644 index 00000000..dc3d04d4 --- /dev/null +++ b/Doc/source/ttLib/tables/G__l_a_t.rst @@ -0,0 +1,8 @@ +``Glat``: Graphite Glyph Attributes Table +----------------------------------------- + +.. automodule:: fontTools.ttLib.tables.G__l_a_t + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/G__l_o_c.rst b/Doc/source/ttLib/tables/G__l_o_c.rst new file mode 100644 index 00000000..cb43e100 --- /dev/null +++ b/Doc/source/ttLib/tables/G__l_o_c.rst @@ -0,0 +1,8 @@ +``Gloc``: Graphite index to glyph attributes table +-------------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.G__l_o_c + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/H_V_A_R_.rst b/Doc/source/ttLib/tables/H_V_A_R_.rst new file mode 100644 index 00000000..14fb2734 --- /dev/null +++ b/Doc/source/ttLib/tables/H_V_A_R_.rst @@ -0,0 +1,7 @@ +``HVAR``:Horizontal Metrics Variations Table +-------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.H_V_A_R_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/J_S_T_F_.rst b/Doc/source/ttLib/tables/J_S_T_F_.rst new file mode 100644 index 00000000..912a0bef --- /dev/null +++ b/Doc/source/ttLib/tables/J_S_T_F_.rst @@ -0,0 +1,7 @@ +``JSTF``: Justification Table +----------------------------- + +.. automodule:: fontTools.ttLib.tables.J_S_T_F_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/L_T_S_H_.rst b/Doc/source/ttLib/tables/L_T_S_H_.rst new file mode 100644 index 00000000..1f4c32f1 --- /dev/null +++ b/Doc/source/ttLib/tables/L_T_S_H_.rst @@ -0,0 +1,8 @@ +``LTSH``: Linear Threshold +-------------------------- + +.. automodule:: fontTools.ttLib.tables.L_T_S_H_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/M_A_T_H_.rst b/Doc/source/ttLib/tables/M_A_T_H_.rst new file mode 100644 index 00000000..1aa2ea2e --- /dev/null +++ b/Doc/source/ttLib/tables/M_A_T_H_.rst @@ -0,0 +1,7 @@ +``MATH``: Mathematical Typesetting Table +---------------------------------------- + +.. automodule:: fontTools.ttLib.tables.M_A_T_H_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/M_E_T_A_.rst b/Doc/source/ttLib/tables/M_E_T_A_.rst new file mode 100644 index 00000000..f2840eae --- /dev/null +++ b/Doc/source/ttLib/tables/M_E_T_A_.rst @@ -0,0 +1,7 @@ +``META``: SING Glyphlet Metadata Table +-------------------------------------- + +.. automodule:: fontTools.ttLib.tables.M_E_T_A_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/M_V_A_R_.rst b/Doc/source/ttLib/tables/M_V_A_R_.rst new file mode 100644 index 00000000..2f5ce673 --- /dev/null +++ b/Doc/source/ttLib/tables/M_V_A_R_.rst @@ -0,0 +1,7 @@ +``MVAR``: Metrics Variations Table +---------------------------------- + +.. automodule:: fontTools.ttLib.tables.M_V_A_R_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/O_S_2f_2.rst b/Doc/source/ttLib/tables/O_S_2f_2.rst new file mode 100644 index 00000000..703502bb --- /dev/null +++ b/Doc/source/ttLib/tables/O_S_2f_2.rst @@ -0,0 +1,7 @@ +``OS/2``: OS/2 and Windows Metrics Table +---------------------------------------- + +.. automodule:: fontTools.ttLib.tables.O_S_2f_2 + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/S_I_N_G_.rst b/Doc/source/ttLib/tables/S_I_N_G_.rst new file mode 100644 index 00000000..f7060120 --- /dev/null +++ b/Doc/source/ttLib/tables/S_I_N_G_.rst @@ -0,0 +1,7 @@ +``SING``: SING Glyphlet Basic Information Table +----------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.S_I_N_G_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/S_T_A_T_.rst b/Doc/source/ttLib/tables/S_T_A_T_.rst new file mode 100644 index 00000000..6aa96f84 --- /dev/null +++ b/Doc/source/ttLib/tables/S_T_A_T_.rst @@ -0,0 +1,7 @@ +``STAT``: Style Attributes Table +-------------------------------- + +.. automodule:: fontTools.ttLib.tables.S_T_A_T_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/S_V_G_.rst b/Doc/source/ttLib/tables/S_V_G_.rst new file mode 100644 index 00000000..bd96f15f --- /dev/null +++ b/Doc/source/ttLib/tables/S_V_G_.rst @@ -0,0 +1,8 @@ +``SVG``: SVG (Scalable Vector Graphics) Table +--------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.S_V_G_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/S__i_l_f.rst b/Doc/source/ttLib/tables/S__i_l_f.rst new file mode 100644 index 00000000..cccda725 --- /dev/null +++ b/Doc/source/ttLib/tables/S__i_l_f.rst @@ -0,0 +1,7 @@ +``Silf``: Graphite Rules Table +------------------------------ + +.. automodule:: fontTools.ttLib.tables.S__i_l_f + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/S__i_l_l.rst b/Doc/source/ttLib/tables/S__i_l_l.rst new file mode 100644 index 00000000..997ebf70 --- /dev/null +++ b/Doc/source/ttLib/tables/S__i_l_l.rst @@ -0,0 +1,7 @@ +``Sill``: Graphite Languages Table +---------------------------------- + +.. automodule:: fontTools.ttLib.tables.S__i_l_l + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/T_T_F_A_.rst b/Doc/source/ttLib/tables/T_T_F_A_.rst new file mode 100644 index 00000000..94a2d260 --- /dev/null +++ b/Doc/source/ttLib/tables/T_T_F_A_.rst @@ -0,0 +1,8 @@ +``TTFA``: ``ttfautohint`` Parameter Table +----------------------------------------- + +.. automodule:: fontTools.ttLib.tables.T_T_F_A_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/VTT_related.rst b/Doc/source/ttLib/tables/VTT_related.rst new file mode 100644 index 00000000..4265acdd --- /dev/null +++ b/Doc/source/ttLib/tables/VTT_related.rst @@ -0,0 +1,99 @@ +Visual TrueType Private Tables +============================== + +``TSI0``: Glyph Program Text Indices +------------------------------------ + +.. automodule:: fontTools.ttLib.tables.T_S_I__0 + :inherited-members: + :members: + :undoc-members: + +``TSI1``: Glyph Program Text UTF-8 Text Dump +-------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.T_S_I__1 + :inherited-members: + :members: + :undoc-members: + +``TSI2``: VTT Talk Text Indices +------------------------------- + +.. automodule:: fontTools.ttLib.tables.T_S_I__2 + :inherited-members: + :members: + :undoc-members: + +``TSI3``: VTT Talk UTF-8 Text Dump +---------------------------------- + +.. automodule:: fontTools.ttLib.tables.T_S_I__3 + :inherited-members: + :members: + :undoc-members: + +``TSI5``: VTT Character Group Flag +---------------------------------- + +.. automodule:: fontTools.ttLib.tables.T_S_I__5 + :inherited-members: + :members: + :undoc-members: + +``TSIB`` +-------- + +.. automodule:: fontTools.ttLib.tables.T_S_I_B_ + :inherited-members: + :members: + :undoc-members: + +``TSIC``: VTT Variation CVT Window Source +----------------------------------------- + +.. automodule:: fontTools.ttLib.tables.T_S_I_C_ + :inherited-members: + :members: + :undoc-members: + +``TSID``: VTT GDEF Table Text Source +------------------------------------ + +.. automodule:: fontTools.ttLib.tables.T_S_I_D_ + :inherited-members: + :members: + :undoc-members: + +``TSIJ``: VTT JSTF Table Text Source +------------------------------------ + +.. automodule:: fontTools.ttLib.tables.T_S_I_J_ + :inherited-members: + :members: + :undoc-members: + +``TSIP``: VTT GPOS Table Text Source +------------------------------------ + +.. automodule:: fontTools.ttLib.tables.T_S_I_P_ + :inherited-members: + :members: + :undoc-members: + +``TSIS``: VTT GSUB Table Text Source +------------------------------------ + +.. automodule:: fontTools.ttLib.tables.T_S_I_S_ + :inherited-members: + :members: + :undoc-members: + +``TSIV`` +-------- + +.. automodule:: fontTools.ttLib.tables.T_S_I_V_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/V_D_M_X_.rst b/Doc/source/ttLib/tables/V_D_M_X_.rst new file mode 100644 index 00000000..bf5fd67b --- /dev/null +++ b/Doc/source/ttLib/tables/V_D_M_X_.rst @@ -0,0 +1,7 @@ +``VDMX``: Vertical Device Metrics +--------------------------------- + +.. automodule:: fontTools.ttLib.tables.V_D_M_X_ + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/V_O_R_G_.rst b/Doc/source/ttLib/tables/V_O_R_G_.rst new file mode 100644 index 00000000..0b8958aa --- /dev/null +++ b/Doc/source/ttLib/tables/V_O_R_G_.rst @@ -0,0 +1,8 @@ +``VORG``: Vertical Origin Table +------------------------------- + +.. automodule:: fontTools.ttLib.tables.V_O_R_G_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/V_V_A_R_.rst b/Doc/source/ttLib/tables/V_V_A_R_.rst new file mode 100644 index 00000000..fce88317 --- /dev/null +++ b/Doc/source/ttLib/tables/V_V_A_R_.rst @@ -0,0 +1,8 @@ +``VVAR``: Vertical Metrics Variations Table +------------------------------------------- + +.. automodule:: fontTools.ttLib.tables.V_V_A_R_ + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_a_n_k_r.rst b/Doc/source/ttLib/tables/_a_n_k_r.rst new file mode 100644 index 00000000..5541ac48 --- /dev/null +++ b/Doc/source/ttLib/tables/_a_n_k_r.rst @@ -0,0 +1,7 @@ +``ankr``: Anchor Point Table +---------------------------- + +.. automodule:: fontTools.ttLib.tables._a_n_k_r + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_a_v_a_r.rst b/Doc/source/ttLib/tables/_a_v_a_r.rst new file mode 100644 index 00000000..81f2b31c --- /dev/null +++ b/Doc/source/ttLib/tables/_a_v_a_r.rst @@ -0,0 +1,8 @@ +``avar``: Axis Variations Table +------------------------------- + +.. automodule:: fontTools.ttLib.tables._a_v_a_r + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_b_s_l_n.rst b/Doc/source/ttLib/tables/_b_s_l_n.rst new file mode 100644 index 00000000..a18fb82e --- /dev/null +++ b/Doc/source/ttLib/tables/_b_s_l_n.rst @@ -0,0 +1,7 @@ +``bsln``: Baseline +------------------ + +.. automodule:: fontTools.ttLib.tables._b_s_l_n + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_c_i_d_g.rst b/Doc/source/ttLib/tables/_c_i_d_g.rst new file mode 100644 index 00000000..f507ebd9 --- /dev/null +++ b/Doc/source/ttLib/tables/_c_i_d_g.rst @@ -0,0 +1,7 @@ +``cidg``: CID to Glyph ID table +------------------------------- + +.. automodule:: fontTools.ttLib.tables._c_i_d_g + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_c_m_a_p.rst b/Doc/source/ttLib/tables/_c_m_a_p.rst new file mode 100644 index 00000000..43248154 --- /dev/null +++ b/Doc/source/ttLib/tables/_c_m_a_p.rst @@ -0,0 +1,6 @@ +``cmap``: Character to Glyph Index Mapping Table +------------------------------------------------ + +.. autoclass:: fontTools.ttLib.tables._c_m_a_p.table__c_m_a_p + +.. autoclass:: fontTools.ttLib.tables._c_m_a_p.CmapSubtable diff --git a/Doc/source/ttLib/tables/_c_v_a_r.rst b/Doc/source/ttLib/tables/_c_v_a_r.rst new file mode 100644 index 00000000..6ae1b0d2 --- /dev/null +++ b/Doc/source/ttLib/tables/_c_v_a_r.rst @@ -0,0 +1,17 @@ +``cvar``: CVT Variations Table +------------------------------ + +.. automodule:: fontTools.ttLib.tables._c_v_a_r + :inherited-members: + :members: + :undoc-members: + + +TupleVariation +^^^^^^^^^^^^^^ + +.. automodule:: fontTools.ttLib.tables.TupleVariation + :noindex: + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_c_v_t.rst b/Doc/source/ttLib/tables/_c_v_t.rst new file mode 100644 index 00000000..ce02c563 --- /dev/null +++ b/Doc/source/ttLib/tables/_c_v_t.rst @@ -0,0 +1,8 @@ +``cvt``: Control Value Table +----------------------------- + +.. automodule:: fontTools.ttLib.tables._c_v_t + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_f_e_a_t.rst b/Doc/source/ttLib/tables/_f_e_a_t.rst new file mode 100644 index 00000000..e32d36c0 --- /dev/null +++ b/Doc/source/ttLib/tables/_f_e_a_t.rst @@ -0,0 +1,7 @@ +``feat``: Feature name table +---------------------------- + +.. automodule:: fontTools.ttLib.tables._f_e_a_t + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_f_p_g_m.rst b/Doc/source/ttLib/tables/_f_p_g_m.rst new file mode 100644 index 00000000..165cb4ca --- /dev/null +++ b/Doc/source/ttLib/tables/_f_p_g_m.rst @@ -0,0 +1,7 @@ +``fpgm``: Font Program +---------------------- + +.. automodule:: fontTools.ttLib.tables._f_p_g_m + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_f_v_a_r.rst b/Doc/source/ttLib/tables/_f_v_a_r.rst new file mode 100644 index 00000000..af83b3e2 --- /dev/null +++ b/Doc/source/ttLib/tables/_f_v_a_r.rst @@ -0,0 +1,8 @@ +``fvar``: Font Variations Table +------------------------------- + +.. automodule:: fontTools.ttLib.tables._f_v_a_r + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_g_a_s_p.rst b/Doc/source/ttLib/tables/_g_a_s_p.rst new file mode 100644 index 00000000..628d155c --- /dev/null +++ b/Doc/source/ttLib/tables/_g_a_s_p.rst @@ -0,0 +1,8 @@ +``gasp``: Grid-fitting and Scan-conversion Procedure Table +---------------------------------------------------------- + +.. automodule:: fontTools.ttLib.tables._g_a_s_p + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_g_c_i_d.rst b/Doc/source/ttLib/tables/_g_c_i_d.rst new file mode 100644 index 00000000..d7cbcf51 --- /dev/null +++ b/Doc/source/ttLib/tables/_g_c_i_d.rst @@ -0,0 +1,7 @@ +``gcid``: Glyph ID to CID table +------------------------------- + +.. automodule:: fontTools.ttLib.tables._g_c_i_d + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_g_l_y_f.rst b/Doc/source/ttLib/tables/_g_l_y_f.rst new file mode 100644 index 00000000..e3099cbf --- /dev/null +++ b/Doc/source/ttLib/tables/_g_l_y_f.rst @@ -0,0 +1,11 @@ +``glyf``: Glyph Data +-------------------- + +.. autoclass:: fontTools.ttLib.tables._g_l_y_f.table__g_l_y_f + :members: +.. autoclass:: fontTools.ttLib.tables._g_l_y_f.Glyph + :members: +.. autoclass:: fontTools.ttLib.tables._g_l_y_f.GlyphComponent + :members: +.. autoclass:: fontTools.ttLib.tables._g_l_y_f.GlyphCoordinates + :members: array, zeros, copy, __len__, __getitem__, __setitem__, __delitem__, append, extend, toInt, relativeToAbsolute, absoluteToRelative, translate, scale, transform, __pos__, __neg__, __iadd__, __isub__, __imul__, __itruediv__, __bool__ diff --git a/Doc/source/ttLib/tables/_g_v_a_r.rst b/Doc/source/ttLib/tables/_g_v_a_r.rst new file mode 100644 index 00000000..d7918a91 --- /dev/null +++ b/Doc/source/ttLib/tables/_g_v_a_r.rst @@ -0,0 +1,16 @@ +``gvar``: Glyph Variations Table +--------------------------------- + +.. automodule:: fontTools.ttLib.tables._g_v_a_r + :inherited-members: + :members: + :undoc-members: + + +TupleVariation +^^^^^^^^^^^^^^ + +.. automodule:: fontTools.ttLib.tables.TupleVariation + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_h_d_m_x.rst b/Doc/source/ttLib/tables/_h_d_m_x.rst new file mode 100644 index 00000000..d18e1621 --- /dev/null +++ b/Doc/source/ttLib/tables/_h_d_m_x.rst @@ -0,0 +1,8 @@ +``hdmx``: Horizontal Device Metrics +----------------------------------- + +.. automodule:: fontTools.ttLib.tables._h_d_m_x + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_h_e_a_d.rst b/Doc/source/ttLib/tables/_h_e_a_d.rst new file mode 100644 index 00000000..daacebd4 --- /dev/null +++ b/Doc/source/ttLib/tables/_h_e_a_d.rst @@ -0,0 +1,8 @@ +``head``: Font Header Table +--------------------------- + +.. automodule:: fontTools.ttLib.tables._h_e_a_d + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_h_h_e_a.rst b/Doc/source/ttLib/tables/_h_h_e_a.rst new file mode 100644 index 00000000..76ba0360 --- /dev/null +++ b/Doc/source/ttLib/tables/_h_h_e_a.rst @@ -0,0 +1,8 @@ +``hhea``: Horizontal Header Table +--------------------------------- + +.. automodule:: fontTools.ttLib.tables._h_h_e_a + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_h_m_t_x.rst b/Doc/source/ttLib/tables/_h_m_t_x.rst new file mode 100644 index 00000000..523480fe --- /dev/null +++ b/Doc/source/ttLib/tables/_h_m_t_x.rst @@ -0,0 +1,8 @@ +``hmtx``: Horizontal Metrics Table +---------------------------------- + +.. automodule:: fontTools.ttLib.tables._h_m_t_x + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_k_e_r_n.rst b/Doc/source/ttLib/tables/_k_e_r_n.rst new file mode 100644 index 00000000..87dae97d --- /dev/null +++ b/Doc/source/ttLib/tables/_k_e_r_n.rst @@ -0,0 +1,8 @@ +``kern``: Kerning +----------------- + +.. automodule:: fontTools.ttLib.tables._k_e_r_n + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_l_c_a_r.rst b/Doc/source/ttLib/tables/_l_c_a_r.rst new file mode 100644 index 00000000..d918b921 --- /dev/null +++ b/Doc/source/ttLib/tables/_l_c_a_r.rst @@ -0,0 +1,8 @@ +``lcar``: Ligature Caret Table +------------------------------ + +.. automodule:: fontTools.ttLib.tables._l_c_a_r + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_l_o_c_a.rst b/Doc/source/ttLib/tables/_l_o_c_a.rst new file mode 100644 index 00000000..cbff5d31 --- /dev/null +++ b/Doc/source/ttLib/tables/_l_o_c_a.rst @@ -0,0 +1,8 @@ +``loca``: Index to Location +--------------------------- + +.. automodule:: fontTools.ttLib.tables._l_o_c_a + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_l_t_a_g.rst b/Doc/source/ttLib/tables/_l_t_a_g.rst new file mode 100644 index 00000000..955aaebe --- /dev/null +++ b/Doc/source/ttLib/tables/_l_t_a_g.rst @@ -0,0 +1,8 @@ +``ltag``: Language Tag +---------------------- + +.. automodule:: fontTools.ttLib.tables._l_t_a_g + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_m_a_x_p.rst b/Doc/source/ttLib/tables/_m_a_x_p.rst new file mode 100644 index 00000000..1825d011 --- /dev/null +++ b/Doc/source/ttLib/tables/_m_a_x_p.rst @@ -0,0 +1,8 @@ +``maxp``: Maximum Profile +------------------------- + +.. automodule:: fontTools.ttLib.tables._m_a_x_p + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_m_e_t_a.rst b/Doc/source/ttLib/tables/_m_e_t_a.rst new file mode 100644 index 00000000..61f8f47f --- /dev/null +++ b/Doc/source/ttLib/tables/_m_e_t_a.rst @@ -0,0 +1,8 @@ +``meta``: Metadata Table +------------------------ + +.. automodule:: fontTools.ttLib.tables._m_e_t_a + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_m_o_r_t.rst b/Doc/source/ttLib/tables/_m_o_r_t.rst new file mode 100644 index 00000000..34ce57e9 --- /dev/null +++ b/Doc/source/ttLib/tables/_m_o_r_t.rst @@ -0,0 +1,9 @@ +``mort``: Glyph Metamorphosis Table +----------------------------------- + +.. automodule:: fontTools.ttLib.tables._m_o_r_t + :inherited-members: + :members: + :undoc-members: + + diff --git a/Doc/source/ttLib/tables/_m_o_r_x.rst b/Doc/source/ttLib/tables/_m_o_r_x.rst new file mode 100644 index 00000000..197ba16c --- /dev/null +++ b/Doc/source/ttLib/tables/_m_o_r_x.rst @@ -0,0 +1,8 @@ +``morx``: Extended Glyph Metamorphosis Table +-------------------------------------------- + +.. automodule:: fontTools.ttLib.tables._m_o_r_x + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_n_a_m_e.rst b/Doc/source/ttLib/tables/_n_a_m_e.rst new file mode 100644 index 00000000..b500a461 --- /dev/null +++ b/Doc/source/ttLib/tables/_n_a_m_e.rst @@ -0,0 +1,8 @@ +``name``: Naming Table +---------------------- + +.. automodule:: fontTools.ttLib.tables._n_a_m_e + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_o_p_b_d.rst b/Doc/source/ttLib/tables/_o_p_b_d.rst new file mode 100644 index 00000000..39d947b3 --- /dev/null +++ b/Doc/source/ttLib/tables/_o_p_b_d.rst @@ -0,0 +1,8 @@ +``opbd``: Optical Bounds Table +------------------------------ + +.. automodule:: fontTools.ttLib.tables._o_p_b_d + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_p_o_s_t.rst b/Doc/source/ttLib/tables/_p_o_s_t.rst new file mode 100644 index 00000000..5035980e --- /dev/null +++ b/Doc/source/ttLib/tables/_p_o_s_t.rst @@ -0,0 +1,8 @@ +``post``: PostScript Table +-------------------------- + +.. automodule:: fontTools.ttLib.tables._p_o_s_t + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_p_r_e_p.rst b/Doc/source/ttLib/tables/_p_r_e_p.rst new file mode 100644 index 00000000..1a538c5a --- /dev/null +++ b/Doc/source/ttLib/tables/_p_r_e_p.rst @@ -0,0 +1,9 @@ +``prep``: Control Value Program +------------------------------- + +.. automodule:: fontTools.ttLib.tables._p_r_e_p + :inherited-members: + :members: + :undoc-members: + + diff --git a/Doc/source/ttLib/tables/_p_r_o_p.rst b/Doc/source/ttLib/tables/_p_r_o_p.rst new file mode 100644 index 00000000..638ba350 --- /dev/null +++ b/Doc/source/ttLib/tables/_p_r_o_p.rst @@ -0,0 +1,8 @@ +``prop``: Glyph Properties Table +-------------------------------- + +.. automodule:: fontTools.ttLib.tables._p_r_o_p + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_s_b_i_x.rst b/Doc/source/ttLib/tables/_s_b_i_x.rst new file mode 100644 index 00000000..389cd532 --- /dev/null +++ b/Doc/source/ttLib/tables/_s_b_i_x.rst @@ -0,0 +1,25 @@ +``sbix``: Standard Bitmap Graphics Table +---------------------------------------- + +.. automodule:: fontTools.ttLib.tables._s_b_i_x + :inherited-members: + :members: + :undoc-members: + + + +sbixGlyph +^^^^^^^^^ + +.. automodule:: fontTools.ttLib.tables.sbixGlyph + :inherited-members: + :members: + :undoc-members: + +sbixStrike +^^^^^^^^^^ + +.. automodule:: fontTools.ttLib.tables.sbixStrike + :inherited-members: + :members: + :undoc-members: diff --git a/Doc/source/ttLib/tables/_t_r_a_k.rst b/Doc/source/ttLib/tables/_t_r_a_k.rst new file mode 100644 index 00000000..34b45462 --- /dev/null +++ b/Doc/source/ttLib/tables/_t_r_a_k.rst @@ -0,0 +1,8 @@ +``trak``: Tracking table +------------------------ + +.. automodule:: fontTools.ttLib.tables._t_r_a_k + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_v_h_e_a.rst b/Doc/source/ttLib/tables/_v_h_e_a.rst new file mode 100644 index 00000000..d45d2261 --- /dev/null +++ b/Doc/source/ttLib/tables/_v_h_e_a.rst @@ -0,0 +1,8 @@ +``vhea``: Vertical Header Table +------------------------------- + +.. automodule:: fontTools.ttLib.tables._v_h_e_a + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/tables/_v_m_t_x.rst b/Doc/source/ttLib/tables/_v_m_t_x.rst new file mode 100644 index 00000000..21adb80c --- /dev/null +++ b/Doc/source/ttLib/tables/_v_m_t_x.rst @@ -0,0 +1,8 @@ +``vmtx``: Vertical Metrics Table +-------------------------------- + +.. automodule:: fontTools.ttLib.tables._v_m_t_x + :inherited-members: + :members: + :undoc-members: + diff --git a/Doc/source/ttLib/ttFont.rst b/Doc/source/ttLib/ttFont.rst index a571050c..a3b4c9d0 100644 --- a/Doc/source/ttLib/ttFont.rst +++ b/Doc/source/ttLib/ttFont.rst @@ -1,9 +1,17 @@ -###### -ttFont -###### +############################################## +ttFont: Read/write OpenType and TrueType fonts +############################################## -.. automodule:: fontTools.ttLib.ttFont +.. autoclass:: fontTools.ttLib.ttFont.TTFont + :inherited-members: + :members: + +.. autoclass:: fontTools.ttLib.ttFont.GlyphOrder :inherited-members: :members: :undoc-members: :private-members: + +.. automodule:: fontTools.ttLib.ttFont + :members: getTableModule, registerCustomTableClass, unregisterCustomTableClass, getCustomTableClass, getClassTag, newTable, tagToIdentifier, identifierToTag, tagToXML, xmlToTag, sortedTagList, reorderFontTables + diff --git a/Doc/source/varLib/index.rst b/Doc/source/varLib/index.rst index 7b224967..1ae4a1b5 100644 --- a/Doc/source/varLib/index.rst +++ b/Doc/source/varLib/index.rst @@ -2,6 +2,25 @@ varLib: OpenType Variation Support ################################## + +.. toctree:: + :maxdepth: 2 + + builder + cff + errors + featureVars + instancer + interpolatable + interpolate_layout + iup + merger + models + mutator + mvar + plot + varStore + The ``fontTools.varLib`` package contains a number of classes and routines for handling, building and interpolating variable font data. These routines rely on a common set of concepts, many of which are equivalent to concepts @@ -90,24 +109,6 @@ support scalar 0 below its minimum or above its maximum. -.. toctree:: - :maxdepth: 2 - - builder - cff - errors - featureVars - instancer - interpolatable - interpolate_layout - iup - merger - models - mutator - mvar - plot - varStore - .. automodule:: fontTools.varLib :inherited-members: :members: diff --git a/Doc/source/voltLib.rst b/Doc/source/voltLib.rst index 7695db7b..be9e8024 100644 --- a/Doc/source/voltLib.rst +++ b/Doc/source/voltLib.rst @@ -3,38 +3,27 @@ voltLib ####### .. automodule:: fontTools.voltLib - :inherited-members: - :members: - :undoc-members: ast --- .. automodule:: fontTools.voltLib.ast - :inherited-members: - :members: :undoc-members: error ----- -.. automodule:: fontTools.voltLib.parser - :inherited-members: - :members: +.. automodule:: fontTools.voltLib.error :undoc-members: lexer ----- .. automodule:: fontTools.voltLib.lexer - :inherited-members: - :members: :undoc-members: parser ------ .. automodule:: fontTools.voltLib.parser - :inherited-members: - :members: :undoc-members: diff --git a/Lib/fontTools/__init__.py b/Lib/fontTools/__init__.py index 82da9b70..7fa7b304 100644 --- a/Lib/fontTools/__init__.py +++ b/Lib/fontTools/__init__.py @@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger log = logging.getLogger(__name__) -version = __version__ = "4.22.0" +version = __version__ = "4.31.2" __all__ = ["version", "log", "configLogger"] diff --git a/Lib/fontTools/agl.py b/Lib/fontTools/agl.py index 4f7ff920..cc286e42 100644 --- a/Lib/fontTools/agl.py +++ b/Lib/fontTools/agl.py @@ -26,7 +26,7 @@ This is used by fontTools when it has to construct glyph names for a font which doesn't include any (e.g. format 3.0 post tables). """ -from fontTools.misc.py23 import tostr +from fontTools.misc.textTools import tostr import re diff --git a/Lib/fontTools/cffLib/__init__.py b/Lib/fontTools/cffLib/__init__.py index d4cd7a17..07d0d513 100644 --- a/Lib/fontTools/cffLib/__init__.py +++ b/Lib/fontTools/cffLib/__init__.py @@ -11,11 +11,10 @@ the demands of variable fonts. This module parses both original CFF and CFF2. """ -from fontTools.misc.py23 import bytechr, byteord, bytesjoin, tobytes, tostr from fontTools.misc import sstruct from fontTools.misc import psCharStrings from fontTools.misc.arrayTools import unionRect, intRect -from fontTools.misc.textTools import safeEval +from fontTools.misc.textTools import bytechr, byteord, bytesjoin, tobytes, tostr, safeEval from fontTools.ttLib import TTFont from fontTools.ttLib.tables.otBase import OTTableWriter from fontTools.ttLib.tables.otBase import OTTableReader @@ -39,6 +38,85 @@ maxStackLimit = 513 # maxstack operator has been deprecated. max stack is now always 513. +class StopHintCountEvent(Exception): + pass + + +class _DesubroutinizingT2Decompiler(psCharStrings.SimpleT2Decompiler): + stop_hintcount_ops = ("op_hintmask", "op_cntrmask", "op_rmoveto", "op_hmoveto", + "op_vmoveto") + + def __init__(self, localSubrs, globalSubrs, private=None): + psCharStrings.SimpleT2Decompiler.__init__(self, localSubrs, globalSubrs, + private) + + def execute(self, charString): + self.need_hintcount = True # until proven otherwise + for op_name in self.stop_hintcount_ops: + setattr(self, op_name, self.stop_hint_count) + + if hasattr(charString, '_desubroutinized'): + # If a charstring has already been desubroutinized, we will still + # need to execute it if we need to count hints in order to + # compute the byte length for mask arguments, and haven't finished + # counting hints pairs. + if self.need_hintcount and self.callingStack: + try: + psCharStrings.SimpleT2Decompiler.execute(self, charString) + except StopHintCountEvent: + del self.callingStack[-1] + return + + charString._patches = [] + psCharStrings.SimpleT2Decompiler.execute(self, charString) + desubroutinized = charString.program[:] + for idx, expansion in reversed(charString._patches): + assert idx >= 2 + assert desubroutinized[idx - 1] in ['callsubr', 'callgsubr'], desubroutinized[idx - 1] + assert type(desubroutinized[idx - 2]) == int + if expansion[-1] == 'return': + expansion = expansion[:-1] + desubroutinized[idx-2:idx] = expansion + if not self.private.in_cff2: + if 'endchar' in desubroutinized: + # Cut off after first endchar + desubroutinized = desubroutinized[:desubroutinized.index('endchar') + 1] + else: + if not len(desubroutinized) or desubroutinized[-1] != 'return': + desubroutinized.append('return') + + charString._desubroutinized = desubroutinized + del charString._patches + + def op_callsubr(self, index): + subr = self.localSubrs[self.operandStack[-1]+self.localBias] + psCharStrings.SimpleT2Decompiler.op_callsubr(self, index) + self.processSubr(index, subr) + + def op_callgsubr(self, index): + subr = self.globalSubrs[self.operandStack[-1]+self.globalBias] + psCharStrings.SimpleT2Decompiler.op_callgsubr(self, index) + self.processSubr(index, subr) + + def stop_hint_count(self, *args): + self.need_hintcount = False + for op_name in self.stop_hintcount_ops: + setattr(self, op_name, None) + cs = self.callingStack[-1] + if hasattr(cs, '_desubroutinized'): + raise StopHintCountEvent() + + def op_hintmask(self, index): + psCharStrings.SimpleT2Decompiler.op_hintmask(self, index) + if self.need_hintcount: + self.stop_hint_count() + + def processSubr(self, index, subr): + cs = self.callingStack[-1] + if not hasattr(cs, '_desubroutinized'): + cs._patches.append((index, subr._desubroutinized)) + + class CFFFontSet(object): """A CFF font "file" can contain more than one font, although this is extremely rare (and not allowed within OpenType fonts). @@ -369,6 +447,35 @@ class CFFFontSet(object): file.seek(0) self.decompile(file, otFont, isCFF2=True) + def desubroutinize(self): + for fontName in self.fontNames: + font = self[fontName] + cs = font.CharStrings + for g in font.charset: + c, _ = cs.getItemAndSelector(g) + c.decompile() + subrs = getattr(c.private, "Subrs", []) + decompiler = _DesubroutinizingT2Decompiler(subrs, c.globalSubrs, c.private) + decompiler.execute(c) + c.program = c._desubroutinized + del c._desubroutinized + # Delete all the local subrs + if hasattr(font, 'FDArray'): + for fd in font.FDArray: + pd = fd.Private + if hasattr(pd, 'Subrs'): + del pd.Subrs + if 'Subrs' in pd.rawDict: + del pd.rawDict['Subrs'] + else: + pd = font.Private + if hasattr(pd, 'Subrs'): + del pd.Subrs + if 'Subrs' in pd.rawDict: + del pd.rawDict['Subrs'] + # as well as the global subrs + self.GlobalSubrs.clear() + class CFFWriter(object): """Helper class for serializing CFF data to binary. Used by diff --git a/Lib/fontTools/colorLib/builder.py b/Lib/fontTools/colorLib/builder.py index 821244af..2577fa76 100644 --- a/Lib/fontTools/colorLib/builder.py +++ b/Lib/fontTools/colorLib/builder.py @@ -21,25 +21,16 @@ from typing import ( TypeVar, Union, ) +from fontTools.misc.arrayTools import intRect from fontTools.misc.fixedTools import fixedToFloat from fontTools.ttLib.tables import C_O_L_R_ from fontTools.ttLib.tables import C_P_A_L_ from fontTools.ttLib.tables import _n_a_m_e from fontTools.ttLib.tables import otTables as ot -from fontTools.ttLib.tables.otTables import ( - ExtendMode, - CompositeMode, - VariableValue, - VariableFloat, - VariableInt, -) +from fontTools.ttLib.tables.otTables import ExtendMode, CompositeMode from .errors import ColorLibError from .geometry import round_start_circle_stable_containment -from .table_builder import ( - convertTupleClass, - BuildCallback, - TableBuilder, -) +from .table_builder import BuildCallback, TableBuilder # TODO move type aliases to colorLib.types? @@ -49,56 +40,54 @@ _PaintInput = Union[int, _Kwargs, ot.Paint, Tuple[str, "_PaintInput"]] _PaintInputList = Sequence[_PaintInput] _ColorGlyphsDict = Dict[str, Union[_PaintInputList, _PaintInput]] _ColorGlyphsV0Dict = Dict[str, Sequence[Tuple[str, int]]] +_ClipBoxInput = Union[ + Tuple[int, int, int, int, int], # format 1, variable + Tuple[int, int, int, int], # format 0, non-variable + ot.ClipBox, +] MAX_PAINT_COLR_LAYER_COUNT = 255 -_DEFAULT_ALPHA = VariableFloat(1.0) +_DEFAULT_ALPHA = 1.0 _MAX_REUSE_LEN = 32 -def _beforeBuildPaintVarRadialGradient(paint, source, srcMapFn=lambda v: v): - # normalize input types (which may or may not specify a varIdx) - x0 = convertTupleClass(VariableFloat, source["x0"]) - y0 = convertTupleClass(VariableFloat, source["y0"]) - r0 = convertTupleClass(VariableFloat, source["r0"]) - x1 = convertTupleClass(VariableFloat, source["x1"]) - y1 = convertTupleClass(VariableFloat, source["y1"]) - r1 = convertTupleClass(VariableFloat, source["r1"]) +def _beforeBuildPaintRadialGradient(paint, source): + x0 = source["x0"] + y0 = source["y0"] + r0 = source["r0"] + x1 = source["x1"] + y1 = source["y1"] + r1 = source["r1"] # TODO apparently no builder_test confirms this works (?) # avoid abrupt change after rounding when c0 is near c1's perimeter - c = round_start_circle_stable_containment( - (x0.value, y0.value), r0.value, (x1.value, y1.value), r1.value - ) - x0, y0 = x0._replace(value=c.centre[0]), y0._replace(value=c.centre[1]) - r0 = r0._replace(value=c.radius) + c = round_start_circle_stable_containment((x0, y0), r0, (x1, y1), r1) + x0, y0 = c.centre + r0 = c.radius # update source to ensure paint is built with corrected values - source["x0"] = srcMapFn(x0) - source["y0"] = srcMapFn(y0) - source["r0"] = srcMapFn(r0) - source["x1"] = srcMapFn(x1) - source["y1"] = srcMapFn(y1) - source["r1"] = srcMapFn(r1) + source["x0"] = x0 + source["y0"] = y0 + source["r0"] = r0 + source["x1"] = x1 + source["y1"] = y1 + source["r1"] = r1 return paint, source -def _beforeBuildPaintRadialGradient(paint, source): - return _beforeBuildPaintVarRadialGradient(paint, source, lambda v: v.value) - - -def _defaultColorIndex(): - colorIndex = ot.ColorIndex() - colorIndex.Alpha = _DEFAULT_ALPHA.value - return colorIndex +def _defaultColorStop(): + colorStop = ot.ColorStop() + colorStop.Alpha = _DEFAULT_ALPHA + return colorStop -def _defaultVarColorIndex(): - colorIndex = ot.VarColorIndex() - colorIndex.Alpha = _DEFAULT_ALPHA - return colorIndex +def _defaultVarColorStop(): + colorStop = ot.VarColorStop() + colorStop.Alpha = _DEFAULT_ALPHA + return colorStop def _defaultColorLine(): @@ -113,6 +102,12 @@ def _defaultVarColorLine(): return colorLine +def _defaultPaintSolid(): + paint = ot.Paint() + paint.Alpha = _DEFAULT_ALPHA + return paint + + def _buildPaintCallbacks(): return { ( @@ -124,11 +119,21 @@ def _buildPaintCallbacks(): BuildCallback.BEFORE_BUILD, ot.Paint, ot.PaintFormat.PaintVarRadialGradient, - ): _beforeBuildPaintVarRadialGradient, - (BuildCallback.CREATE_DEFAULT, ot.ColorIndex): _defaultColorIndex, - (BuildCallback.CREATE_DEFAULT, ot.VarColorIndex): _defaultVarColorIndex, + ): _beforeBuildPaintRadialGradient, + (BuildCallback.CREATE_DEFAULT, ot.ColorStop): _defaultColorStop, + (BuildCallback.CREATE_DEFAULT, ot.VarColorStop): _defaultVarColorStop, (BuildCallback.CREATE_DEFAULT, ot.ColorLine): _defaultColorLine, (BuildCallback.CREATE_DEFAULT, ot.VarColorLine): _defaultVarColorLine, + ( + BuildCallback.CREATE_DEFAULT, + ot.Paint, + ot.PaintFormat.PaintSolid, + ): _defaultPaintSolid, + ( + BuildCallback.CREATE_DEFAULT, + ot.Paint, + ot.PaintFormat.PaintVarSolid, + ): _defaultPaintSolid, } @@ -140,11 +145,11 @@ def populateCOLRv0( """Build v0 color layers and add to existing COLR table. Args: - table: a raw otTables.COLR() object (not ttLib's table_C_O_L_R_). + table: a raw ``otTables.COLR()`` object (not ttLib's ``table_C_O_L_R_``). colorGlyphsV0: map of base glyph names to lists of (layer glyph names, - color palette index) tuples. + color palette index) tuples. Can be empty. glyphMap: a map from glyph names to glyph indices, as returned from - TTFont.getReverseGlyphMap(), to optionally sort base records by GID. + ``TTFont.getReverseGlyphMap()``, to optionally sort base records by GID. """ if glyphMap is not None: colorGlyphItems = sorted( @@ -167,11 +172,14 @@ def populateCOLRv0( layerRec.PaletteIndex = paletteIndex layerRecords.append(layerRec) + table.BaseGlyphRecordArray = table.LayerRecordArray = None + if baseGlyphRecords: + table.BaseGlyphRecordArray = ot.BaseGlyphRecordArray() + table.BaseGlyphRecordArray.BaseGlyphRecord = baseGlyphRecords + if layerRecords: + table.LayerRecordArray = ot.LayerRecordArray() + table.LayerRecordArray.LayerRecord = layerRecords table.BaseGlyphRecordCount = len(baseGlyphRecords) - table.BaseGlyphRecordArray = ot.BaseGlyphRecordArray() - table.BaseGlyphRecordArray.BaseGlyphRecord = baseGlyphRecords - table.LayerRecordArray = ot.LayerRecordArray() - table.LayerRecordArray.LayerRecord = layerRecords table.LayerRecordCount = len(layerRecords) @@ -180,12 +188,16 @@ def buildCOLR( version: Optional[int] = None, glyphMap: Optional[Mapping[str, int]] = None, varStore: Optional[ot.VarStore] = None, + varIndexMap: Optional[ot.DeltaSetIndexMap] = None, + clipBoxes: Optional[Dict[str, _ClipBoxInput]] = None, ) -> C_O_L_R_.table_C_O_L_R_: """Build COLR table from color layers mapping. + Args: + colorGlyphs: map of base glyph name to, either list of (layer glyph name, - color palette index) tuples for COLRv0; or a single Paint (dict) or - list of Paint for COLRv1. + color palette index) tuples for COLRv0; or a single ``Paint`` (dict) or + list of ``Paint`` for COLRv1. version: the version of COLR table. If None, the version is determined by the presence of COLRv1 paints or variation data (varStore), which require version 1; otherwise, if all base glyphs use only simple color @@ -193,7 +205,11 @@ def buildCOLR( glyphMap: a map from glyph names to glyph indices, as returned from TTFont.getReverseGlyphMap(), to optionally sort base records by GID. varStore: Optional ItemVarationStore for deltas associated with v1 layer. - Return: + varIndexMap: Optional DeltaSetIndexMap for deltas associated with v1 layer. + clipBoxes: Optional map of base glyph name to clip box 4- or 5-tuples: + (xMin, yMin, xMax, yMax) or (xMin, yMin, xMax, yMax, varIndexBase). + + Returns: A new COLR table. """ self = C_O_L_R_.table_C_O_L_R_() @@ -209,18 +225,13 @@ def buildCOLR( else: # unless explicitly requested for v1 or have variations, in which case # we encode all color glyph as v1 - colorGlyphsV0, colorGlyphsV1 = None, colorGlyphs + colorGlyphsV0, colorGlyphsV1 = {}, colorGlyphs colr = ot.COLR() - if colorGlyphsV0: - populateCOLRv0(colr, colorGlyphsV0, glyphMap) - else: - colr.BaseGlyphRecordCount = colr.LayerRecordCount = 0 - colr.BaseGlyphRecordArray = colr.LayerRecordArray = None + populateCOLRv0(colr, colorGlyphsV0, glyphMap) - if colorGlyphsV1: - colr.LayerV1List, colr.BaseGlyphV1List = buildColrV1(colorGlyphsV1, glyphMap) + colr.LayerList, colr.BaseGlyphList = buildColrV1(colorGlyphsV1, glyphMap) if version is None: version = 1 if (varStore or colorGlyphsV1) else 0 @@ -231,12 +242,38 @@ def buildCOLR( if version == 0: self.ColorLayers = self._decompileColorLayersV0(colr) else: + clipBoxes = { + name: clipBoxes[name] for name in clipBoxes or {} if name in colorGlyphsV1 + } + colr.ClipList = buildClipList(clipBoxes) if clipBoxes else None + colr.VarIndexMap = varIndexMap colr.VarStore = varStore self.table = colr return self +def buildClipList(clipBoxes: Dict[str, _ClipBoxInput]) -> ot.ClipList: + clipList = ot.ClipList() + clipList.Format = 1 + clipList.clips = {name: buildClipBox(box) for name, box in clipBoxes.items()} + return clipList + + +def buildClipBox(clipBox: _ClipBoxInput) -> ot.ClipBox: + if isinstance(clipBox, ot.ClipBox): + return clipBox + n = len(clipBox) + clip = ot.ClipBox() + if n not in (4, 5): + raise ValueError(f"Invalid ClipBox: expected 4 or 5 values, found {n}") + clip.xMin, clip.yMin, clip.xMax, clip.yMax = intRect(clipBox[:4]) + clip.Format = int(n == 5) + 1 + if n == 5: + clip.VarIndexBase = int(clipBox[4]) + return clip + + class ColorPaletteType(enum.IntFlag): USABLE_WITH_LIGHT_BACKGROUND = 0x0001 USABLE_WITH_DARK_BACKGROUND = 0x0002 @@ -406,15 +443,13 @@ def _reuse_ranges(num_layers: int) -> Generator[Tuple[int, int], None, None]: yield (lbound, ubound) -class LayerV1ListBuilder: - slices: List[ot.Paint] +class LayerListBuilder: layers: List[ot.Paint] reusePool: Mapping[Tuple[Any, ...], int] tuples: Mapping[int, Tuple[Any, ...]] keepAlive: List[ot.Paint] # we need id to remain valid def __init__(self): - self.slices = [] self.layers = [] self.reusePool = {} self.tuples = {} @@ -459,10 +494,6 @@ class LayerV1ListBuilder: # COLR layers is unusual in that it modifies shared state # so we need a callback into an object def _beforeBuildPaintColrLayers(self, dest, source): - paint = ot.Paint() - paint.Format = int(ot.PaintFormat.PaintColrLayers) - self.slices.append(paint) - # Sketchy gymnastics: a sequence input will have dropped it's layers # into NumLayers; get it back if isinstance(source.get("NumLayers", None), collections.abc.Sequence): @@ -520,6 +551,12 @@ class LayerV1ListBuilder: layers = [listToColrLayers(l) for l in layers] + # No reason to have a colr layers with just one entry + if len(layers) == 1: + return layers[0], {} + + paint = ot.Paint() + paint.Format = int(ot.PaintFormat.PaintColrLayers) paint.NumLayers = len(layers) paint.FirstLayerIndex = len(self.layers) self.layers.extend(layers) @@ -538,17 +575,19 @@ class LayerV1ListBuilder: def buildPaint(self, paint: _PaintInput) -> ot.Paint: return self.tableBuilder.build(ot.Paint, paint) - def build(self) -> ot.LayerV1List: - layers = ot.LayerV1List() + def build(self) -> Optional[ot.LayerList]: + if not self.layers: + return None + layers = ot.LayerList() layers.LayerCount = len(self.layers) layers.Paint = self.layers return layers -def buildBaseGlyphV1Record( - baseGlyph: str, layerBuilder: LayerV1ListBuilder, paint: _PaintInput -) -> ot.BaseGlyphV1List: - self = ot.BaseGlyphV1Record() +def buildBaseGlyphPaintRecord( + baseGlyph: str, layerBuilder: LayerListBuilder, paint: _PaintInput +) -> ot.BaseGlyphList: + self = ot.BaseGlyphPaintRecord() self.BaseGlyph = baseGlyph self.Paint = layerBuilder.buildPaint(paint) return self @@ -564,7 +603,7 @@ def _format_glyph_errors(errors: Mapping[str, Exception]) -> str: def buildColrV1( colorGlyphs: _ColorGlyphsDict, glyphMap: Optional[Mapping[str, int]] = None, -) -> Tuple[ot.LayerV1List, ot.BaseGlyphV1List]: +) -> Tuple[Optional[ot.LayerList], ot.BaseGlyphList]: if glyphMap is not None: colorGlyphItems = sorted( colorGlyphs.items(), key=lambda item: glyphMap[item[0]] @@ -574,24 +613,24 @@ def buildColrV1( errors = {} baseGlyphs = [] - layerBuilder = LayerV1ListBuilder() + layerBuilder = LayerListBuilder() for baseGlyph, paint in colorGlyphItems: try: - baseGlyphs.append(buildBaseGlyphV1Record(baseGlyph, layerBuilder, paint)) + baseGlyphs.append(buildBaseGlyphPaintRecord(baseGlyph, layerBuilder, paint)) except (ColorLibError, OverflowError, ValueError, TypeError) as e: errors[baseGlyph] = e if errors: failed_glyphs = _format_glyph_errors(errors) - exc = ColorLibError(f"Failed to build BaseGlyphV1List:\n{failed_glyphs}") + exc = ColorLibError(f"Failed to build BaseGlyphList:\n{failed_glyphs}") exc.errors = errors raise exc from next(iter(errors.values())) layers = layerBuilder.build() - glyphs = ot.BaseGlyphV1List() + glyphs = ot.BaseGlyphList() glyphs.BaseGlyphCount = len(baseGlyphs) - glyphs.BaseGlyphV1Record = baseGlyphs + glyphs.BaseGlyphPaintRecord = baseGlyphs return (layers, glyphs) diff --git a/Lib/fontTools/colorLib/geometry.py b/Lib/fontTools/colorLib/geometry.py index e62aead1..1ce161bf 100644 --- a/Lib/fontTools/colorLib/geometry.py +++ b/Lib/fontTools/colorLib/geometry.py @@ -1,6 +1,6 @@ """Helpers for manipulating 2D points and vectors in COLR table.""" -from math import copysign, cos, hypot, pi +from math import copysign, cos, hypot, isclose, pi from fontTools.misc.roundTools import otRound @@ -19,9 +19,7 @@ def _unit_vector(vec): return (vec[0] / length, vec[1] / length) -# This is the same tolerance used by Skia's SkTwoPointConicalGradient.cpp to detect -# when a radial gradient's focal point lies on the end circle. -_NEARLY_ZERO = 1 / (1 << 12) # 0.000244140625 +_CIRCLE_INSIDE_TOLERANCE = 1e-4 # The unit vector's X and Y components are respectively @@ -64,10 +62,10 @@ class Circle: def round(self): return Circle(_round_point(self.centre), otRound(self.radius)) - def inside(self, outer_circle): + def inside(self, outer_circle, tolerance=_CIRCLE_INSIDE_TOLERANCE): dist = self.radius + hypot(*_vector_between(self.centre, outer_circle.centre)) return ( - abs(outer_circle.radius - dist) <= _NEARLY_ZERO + isclose(outer_circle.radius, dist, rel_tol=_CIRCLE_INSIDE_TOLERANCE) or outer_circle.radius > dist ) diff --git a/Lib/fontTools/colorLib/table_builder.py b/Lib/fontTools/colorLib/table_builder.py index 6fba6b0f..763115b9 100644 --- a/Lib/fontTools/colorLib/table_builder.py +++ b/Lib/fontTools/colorLib/table_builder.py @@ -17,10 +17,9 @@ from fontTools.ttLib.tables.otConverters import ( Short, UInt8, UShort, - VarInt16, - VarUInt16, IntValue, FloatValue, + OptionalValue, ) from fontTools.misc.roundTools import otRound @@ -39,7 +38,7 @@ class BuildCallback(enum.Enum): """ AFTER_BUILD = enum.auto() - """Keyed on (CREATE_DEFAULT, class). + """Keyed on (CREATE_DEFAULT, class[, Format if available]). Receives no arguments. Should return a new instance of class. """ @@ -50,37 +49,29 @@ def _assignable(convertersByName): return {k: v for k, v in convertersByName.items() if not isinstance(v, ComputedInt)} -def convertTupleClass(tupleClass, value): - if isinstance(value, tupleClass): - return value - if isinstance(value, tuple): - return tupleClass(*value) - return tupleClass(value) - - def _isNonStrSequence(value): return isinstance(value, collections.abc.Sequence) and not isinstance(value, str) -def _set_format(dest, source): +def _split_format(cls, source): if _isNonStrSequence(source): - assert len(source) > 0, f"{type(dest)} needs at least format from {source}" - dest.Format = source[0] - source = source[1:] + assert len(source) > 0, f"{cls} needs at least format from {source}" + fmt, remainder = source[0], source[1:] elif isinstance(source, collections.abc.Mapping): - assert "Format" in source, f"{type(dest)} needs at least Format from {source}" - dest.Format = source["Format"] + assert "Format" in source, f"{cls} needs at least Format from {source}" + remainder = source.copy() + fmt = remainder.pop("Format") else: - raise ValueError(f"Not sure how to populate {type(dest)} from {source}") + raise ValueError(f"Not sure how to populate {cls} from {source}") assert isinstance( - dest.Format, collections.abc.Hashable - ), f"{type(dest)} Format is not hashable: {dest.Format}" + fmt, collections.abc.Hashable + ), f"{cls} Format is not hashable: {fmt!r}" assert ( - dest.Format in dest.convertersByName - ), f"{dest.Format} invalid Format of {cls}" + fmt in cls.convertersByName + ), f"{cls} invalid Format: {fmt!r}" - return source + return fmt, remainder class TableBuilder: @@ -97,13 +88,9 @@ class TableBuilder: self._callbackTable = callbackTable def _convert(self, dest, field, converter, value): - tupleClass = getattr(converter, "tupleClass", None) enumClass = getattr(converter, "enumClass", None) - if tupleClass: - value = convertTupleClass(tupleClass, value) - - elif enumClass: + if enumClass: if isinstance(value, enumClass): pass elif isinstance(value, str): @@ -140,6 +127,11 @@ class TableBuilder: return source callbackKey = (cls,) + fmt = None + if issubclass(cls, FormatSwitchingBaseTable): + fmt, source = _split_format(cls, source) + callbackKey = (cls, fmt) + dest = self._callbackTable.get( (BuildCallback.CREATE_DEFAULT,) + callbackKey, lambda: cls() )() @@ -150,11 +142,9 @@ class TableBuilder: # For format switchers we need to resolve converters based on format if issubclass(cls, FormatSwitchingBaseTable): - source = _set_format(dest, source) - + dest.Format = fmt convByName = _assignable(convByName[dest.Format]) skippedFields.add("Format") - callbackKey = (cls, dest.Format) # Convert sequence => mapping so before thunk only has to handle one format if _isNonStrSequence(source): @@ -182,6 +172,10 @@ class TableBuilder: # let's try as a 1-tuple dest = self.build(cls, (source,)) + for field, conv in convByName.items(): + if not hasattr(dest, field) and isinstance(conv, OptionalValue): + setattr(dest, field, conv.DEFAULT) + dest = self._callbackTable.get( (BuildCallback.AFTER_BUILD,) + callbackKey, lambda d: d )(dest) @@ -210,11 +204,8 @@ class TableUnbuilder: continue value = getattr(table, converter.name) - tupleClass = getattr(converter, "tupleClass", None) enumClass = getattr(converter, "enumClass", None) - if tupleClass: - source[converter.name] = tuple(value) - elif enumClass: + if enumClass: source[converter.name] = value.name.lower() elif isinstance(converter, Struct): if converter.repeat: diff --git a/Lib/fontTools/colorLib/unbuilder.py b/Lib/fontTools/colorLib/unbuilder.py index 43582bde..03458907 100644 --- a/Lib/fontTools/colorLib/unbuilder.py +++ b/Lib/fontTools/colorLib/unbuilder.py @@ -2,11 +2,14 @@ from fontTools.ttLib.tables import otTables as ot from .table_builder import TableUnbuilder -def unbuildColrV1(layerV1List, baseGlyphV1List): - unbuilder = LayerV1ListUnbuilder(layerV1List.Paint) +def unbuildColrV1(layerList, baseGlyphList): + layers = [] + if layerList: + layers = layerList.Paint + unbuilder = LayerListUnbuilder(layers) return { rec.BaseGlyph: unbuilder.unbuildPaint(rec.Paint) - for rec in baseGlyphV1List.BaseGlyphV1Record + for rec in baseGlyphList.BaseGlyphPaintRecord } @@ -18,7 +21,7 @@ def _flatten(lst): yield el -class LayerV1ListUnbuilder: +class LayerListUnbuilder: def __init__(self, layers): self.layers = layers @@ -71,9 +74,8 @@ if __name__ == "__main__": sys.exit(f"error: No COLR table version=1 found in {fontfile}") colorGlyphs = unbuildColrV1( - colr.table.LayerV1List, - colr.table.BaseGlyphV1List, - ignoreVarIdx=not colr.table.VarStore, + colr.table.LayerList, + colr.table.BaseGlyphList, ) pprint(colorGlyphs) diff --git a/Lib/fontTools/cu2qu/cli.py b/Lib/fontTools/cu2qu/cli.py index d4e83b88..34520fc0 100644 --- a/Lib/fontTools/cu2qu/cli.py +++ b/Lib/fontTools/cu2qu/cli.py @@ -29,8 +29,14 @@ def _cpu_count(): return 1 +def open_ufo(path): + if hasattr(ufo_module.Font, "open"): # ufoLib2 + return ufo_module.Font.open(path) + return ufo_module.Font(path) # defcon + + def _font_to_quadratic(input_path, output_path=None, **kwargs): - ufo = ufo_module.Font(input_path) + ufo = open_ufo(input_path) logger.info('Converting curves for %s', input_path) if font_to_quadratic(ufo, **kwargs): logger.info("Saving %s", output_path) @@ -152,7 +158,7 @@ def main(args=None): if options.interpolatable: logger.info('Converting curves compatibly') - ufos = [ufo_module.Font(infile) for infile in options.infiles] + ufos = [open_ufo(infile) for infile in options.infiles] if fonts_to_quadratic(ufos, **kwargs): for ufo, output_path in zip(ufos, output_paths): logger.info("Saving %s", output_path) diff --git a/Lib/fontTools/designspaceLib/__init__.py b/Lib/fontTools/designspaceLib/__init__.py index 9ea22fe6..4b706827 100644 --- a/Lib/fontTools/designspaceLib/__init__.py +++ b/Lib/fontTools/designspaceLib/__init__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -from fontTools.misc.py23 import tobytes, tostr from fontTools.misc.loggingTools import LogMixin +from fontTools.misc.textTools import tobytes, tostr import collections from io import BytesIO, StringIO import os @@ -33,6 +33,9 @@ def posix(path): if path.startswith('/'): # The above transformation loses absolute paths new_path = '/' + new_path + elif path.startswith(r'\\'): + # The above transformation loses leading slashes of UNC path mounts + new_path = '//' + new_path return new_path @@ -157,18 +160,22 @@ class SourceDescriptor(SimpleDescriptor): class RuleDescriptor(SimpleDescriptor): - """ - - - - - - - - - - - + """Represents the rule descriptor element + + .. code-block:: xml + + + + + + + + + + + + + """ _attrs = ['name', 'conditionSets', 'subs'] # what do we need here @@ -993,7 +1000,10 @@ class BaseDocReader(LogMixin): def readGlyphElement(self, glyphElement, instanceObject): """ - Read the glyph element. + Read the glyph element: + + .. code-block:: xml + diff --git a/Lib/fontTools/feaLib/__main__.py b/Lib/fontTools/feaLib/__main__.py index 99c64231..a45230e8 100644 --- a/Lib/fontTools/feaLib/__main__.py +++ b/Lib/fontTools/feaLib/__main__.py @@ -12,7 +12,7 @@ log = logging.getLogger("fontTools.feaLib") def main(args=None): - """Add features from a feature file (.fea) into a OTF font""" + """Add features from a feature file (.fea) into an OTF font""" parser = argparse.ArgumentParser( description="Use fontTools to compile OpenType feature files (*.fea)." ) @@ -46,7 +46,7 @@ def main(args=None): parser.add_argument( "-v", "--verbose", - help="increase the logger verbosity. Multiple -v " "options are allowed.", + help="Increase the logger verbosity. Multiple -v " "options are allowed.", action="count", default=0, ) @@ -70,6 +70,7 @@ def main(args=None): if options.traceback: raise log.error(e) + sys.exit(1) font.save(output_font) diff --git a/Lib/fontTools/feaLib/ast.py b/Lib/fontTools/feaLib/ast.py index 763d0d2c..1273343d 100644 --- a/Lib/fontTools/feaLib/ast.py +++ b/Lib/fontTools/feaLib/ast.py @@ -1,7 +1,7 @@ -from fontTools.misc.py23 import byteord, tobytes from fontTools.feaLib.error import FeatureLibError from fontTools.feaLib.location import FeatureLibLocation from fontTools.misc.encodingTools import getEncoding +from fontTools.misc.textTools import byteord, tobytes from collections import OrderedDict import itertools @@ -34,6 +34,7 @@ __all__ = [ "ChainContextPosStatement", "ChainContextSubstStatement", "CharacterStatement", + "ConditionsetStatement", "CursivePosStatement", "ElidedFallbackName", "ElidedFallbackNameID", @@ -700,7 +701,7 @@ class AttachStatement(Statement): class ChainContextPosStatement(Statement): - """A chained contextual positioning statement. + r"""A chained contextual positioning statement. ``prefix``, ``glyphs``, and ``suffix`` should be lists of `glyph-containing objects`_ . @@ -758,7 +759,7 @@ class ChainContextPosStatement(Statement): class ChainContextSubstStatement(Statement): - """A chained contextual substitution statement. + r"""A chained contextual substitution statement. ``prefix``, ``glyphs``, and ``suffix`` should be lists of `glyph-containing objects`_ . @@ -1258,9 +1259,25 @@ class MultipleSubstStatement(Statement): """Calls the builder object's ``add_multiple_subst`` callback.""" prefix = [p.glyphSet() for p in self.prefix] suffix = [s.glyphSet() for s in self.suffix] - builder.add_multiple_subst( - self.location, prefix, self.glyph, suffix, self.replacement, self.forceChain - ) + if not self.replacement and hasattr(self.glyph, "glyphSet"): + for glyph in self.glyph.glyphSet(): + builder.add_multiple_subst( + self.location, + prefix, + glyph, + suffix, + self.replacement, + self.forceChain, + ) + else: + builder.add_multiple_subst( + self.location, + prefix, + self.glyph, + suffix, + self.replacement, + self.forceChain, + ) def asFea(self, indent=""): res = "sub " @@ -1314,10 +1331,16 @@ class PairPosStatement(Statement): """ if self.enumerated: g = [self.glyphs1.glyphSet(), self.glyphs2.glyphSet()] + seen_pair = False for glyph1, glyph2 in itertools.product(*g): + seen_pair = True builder.add_specific_pair_pos( self.location, glyph1, self.valuerecord1, glyph2, self.valuerecord2 ) + if not seen_pair: + raise FeatureLibError( + "Empty glyph class in positioning rule", self.location + ) return is_specific = isinstance(self.glyphs1, GlyphName) and isinstance( @@ -2027,3 +2050,79 @@ class AxisValueLocationStatement(Statement): res += f"location {self.tag} " res += f"{' '.join(str(i) for i in self.values)};\n" return res + + +class ConditionsetStatement(Statement): + """ + A variable layout conditionset + + Args: + name (str): the name of this conditionset + conditions (dict): a dictionary mapping axis tags to a + tuple of (min,max) userspace coordinates. + """ + + def __init__(self, name, conditions, location=None): + Statement.__init__(self, location) + self.name = name + self.conditions = conditions + + def build(self, builder): + builder.add_conditionset(self.name, self.conditions) + + def asFea(self, res="", indent=""): + res += indent + f"conditionset {self.name} " + "{\n" + for tag, (minvalue, maxvalue) in self.conditions.items(): + res += indent + SHIFT + f"{tag} {minvalue} {maxvalue};\n" + res += indent + "}" + f" {self.name};\n" + return res + + +class VariationBlock(Block): + """A variation feature block, applicable in a given set of conditions.""" + + def __init__(self, name, conditionset, use_extension=False, location=None): + Block.__init__(self, location) + self.name, self.conditionset, self.use_extension = ( + name, + conditionset, + use_extension, + ) + + def build(self, builder): + """Call the ``start_feature`` callback on the builder object, visit + all the statements in this feature, and then call ``end_feature``.""" + builder.start_feature(self.location, self.name) + if ( + self.conditionset != "NULL" + and self.conditionset not in builder.conditionsets_ + ): + raise FeatureLibError( + f"variation block used undefined conditionset {self.conditionset}", + self.location, + ) + + # language exclude_dflt statements modify builder.features_ + # limit them to this block with temporary builder.features_ + features = builder.features_ + builder.features_ = {} + Block.build(self, builder) + for key, value in builder.features_.items(): + items = builder.feature_variations_.setdefault(key, {}).setdefault( + self.conditionset, [] + ) + items.extend(value) + if key not in features: + features[key] = [] # Ensure we make a feature record + builder.features_ = features + builder.end_feature() + + def asFea(self, indent=""): + res = indent + "variation %s " % self.name.strip() + res += self.conditionset + " " + if self.use_extension: + res += "useExtension " + res += "{\n" + res += Block.asFea(self, indent=indent) + res += indent + "} %s;\n" % self.name.strip() + return res diff --git a/Lib/fontTools/feaLib/builder.py b/Lib/fontTools/feaLib/builder.py index 4a7d9575..a1644875 100644 --- a/Lib/fontTools/feaLib/builder.py +++ b/Lib/fontTools/feaLib/builder.py @@ -1,6 +1,5 @@ -from fontTools.misc.py23 import Tag, tostr from fontTools.misc import sstruct -from fontTools.misc.textTools import binary2num, safeEval +from fontTools.misc.textTools import Tag, tostr, binary2num, safeEval from fontTools.feaLib.error import FeatureLibError from fontTools.feaLib.lookupDebugInfo import ( LookupDebugInfo, @@ -9,6 +8,7 @@ from fontTools.feaLib.lookupDebugInfo import ( ) from fontTools.feaLib.parser import Parser from fontTools.feaLib.ast import FeatureFile +from fontTools.feaLib.variableScalar import VariableScalar from fontTools.otlLib import builder as otl from fontTools.otlLib.maxContextCalc import maxCtxFont from fontTools.ttLib import newTable, getTableModule @@ -31,6 +31,10 @@ from fontTools.otlLib.builder import ( ChainContextualRule, ) from fontTools.otlLib.error import OpenTypeLibError +from fontTools.varLib.varStore import OnlineVarStoreBuilder +from fontTools.varLib.builder import buildVarDevTable +from fontTools.varLib.featureVars import addFeatureVariationsRaw +from fontTools.varLib.models import normalizeValue from collections import defaultdict import itertools from io import StringIO @@ -112,6 +116,12 @@ class Builder(object): else: self.parseTree, self.file = None, featurefile self.glyphMap = font.getReverseGlyphMap() + self.varstorebuilder = None + if "fvar" in font: + self.axes = font["fvar"].axes + self.varstorebuilder = OnlineVarStoreBuilder( + [ax.axisTag for ax in self.axes] + ) self.default_language_systems_ = set() self.script_ = None self.lookupflag_ = 0 @@ -126,6 +136,7 @@ class Builder(object): self.lookup_locations = {"GSUB": {}, "GPOS": {}} self.features_ = {} # ('latn', 'DEU ', 'smcp') --> [LookupBuilder*] self.required_features_ = {} # ('latn', 'DEU ') --> 'scmp' + self.feature_variations_ = {} # for feature 'aalt' self.aalt_features_ = [] # [(location, featureName)*], for 'aalt' self.aalt_location_ = None @@ -163,6 +174,8 @@ class Builder(object): self.vhea_ = {} # for table 'STAT' self.stat_ = {} + # for conditionsets + self.conditionsets_ = {} def build(self, tables=None, debug=False): if self.parseTree is None: @@ -198,6 +211,8 @@ class Builder(object): if tag not in tables: continue table = self.makeTable(tag) + if self.feature_variations_: + self.makeFeatureVariations(table, tag) if ( table.ScriptList.ScriptCount > 0 or table.FeatureList.FeatureCount > 0 @@ -215,6 +230,8 @@ class Builder(object): self.font["GDEF"] = gdef elif "GDEF" in self.font: del self.font["GDEF"] + elif self.varstorebuilder: + raise FeatureLibError("Must save GDEF when compiling a variable font") if "BASE" in tables: base = self.buildBASE() if base: @@ -745,6 +762,16 @@ class Builder(object): gdef.MarkAttachClassDef = self.buildGDEFMarkAttachClassDef_() gdef.MarkGlyphSetsDef = self.buildGDEFMarkGlyphSetsDef_() gdef.Version = 0x00010002 if gdef.MarkGlyphSetsDef else 0x00010000 + if self.varstorebuilder: + store = self.varstorebuilder.finish() + if store.VarData: + gdef.Version = 0x00010003 + gdef.VarStore = store + varidx_map = store.optimize() + + gdef.remap_device_varidxes(varidx_map) + if 'GPOS' in self.font: + self.font['GPOS'].table.remap_device_varidxes(varidx_map) if any( ( gdef.GlyphClassDef, @@ -753,7 +780,7 @@ class Builder(object): gdef.MarkAttachClassDef, gdef.MarkGlyphSetsDef, ) - ): + ) or hasattr(gdef, "VarStore"): result = newTable("GDEF") result.table = gdef return result @@ -849,7 +876,8 @@ class Builder(object): ) size_feature = tag == "GPOS" and feature_tag == "size" - if len(lookup_indices) == 0 and not size_feature: + force_feature = self.any_feature_variations(feature_tag, tag) + if len(lookup_indices) == 0 and not size_feature and not force_feature: continue for ix in lookup_indices: @@ -915,6 +943,42 @@ class Builder(object): table.LookupList.LookupCount = len(table.LookupList.Lookup) return table + def makeFeatureVariations(self, table, table_tag): + feature_vars = {} + has_any_variations = False + # Sort out which lookups to build, gather their indices + for ( + script_, + language, + feature_tag, + ), variations in self.feature_variations_.items(): + feature_vars[feature_tag] = [] + for conditionset, builders in variations.items(): + raw_conditionset = self.conditionsets_[conditionset] + indices = [] + for b in builders: + if b.table != table_tag: + continue + assert b.lookup_index is not None + indices.append(b.lookup_index) + has_any_variations = True + feature_vars[feature_tag].append((raw_conditionset, indices)) + + if has_any_variations: + for feature_tag, conditions_and_lookups in feature_vars.items(): + addFeatureVariationsRaw( + self.font, table, conditions_and_lookups, feature_tag + ) + + def any_feature_variations(self, feature_tag, table_tag): + for (_, _, feature), variations in self.feature_variations_.items(): + if feature != feature_tag: + continue + for conditionset, builders in variations.items(): + if any(b.table == table_tag for b in builders): + return True + return False + def get_lookup_name_(self, lookup): rev = {v: k for k, v in self.named_lookups_.items()} if lookup in rev: @@ -1005,7 +1069,8 @@ class Builder(object): assert lookup_name in self.named_lookups_, lookup_name self.cur_lookup_ = None lookup = self.named_lookups_[lookup_name] - self.add_lookup_to_feature_(lookup, self.cur_feature_name_) + if lookup is not None: # skip empty named lookup + self.add_lookup_to_feature_(lookup, self.cur_feature_name_) def set_font_revision(self, location, revision): self.fontRevision_ = revision @@ -1130,39 +1195,6 @@ class Builder(object): for glyph in glyphs: self.attachPoints_.setdefault(glyph, set()).update(contourPoints) - def add_chain_context_pos(self, location, prefix, glyphs, suffix, lookups): - lookup = self.get_lookup_(location, ChainContextPosBuilder) - lookup.rules.append( - ChainContextualRule( - prefix, glyphs, suffix, self.find_lookup_builders_(lookups) - ) - ) - - def add_chain_context_subst(self, location, prefix, glyphs, suffix, lookups): - lookup = self.get_lookup_(location, ChainContextSubstBuilder) - lookup.rules.append( - ChainContextualRule( - prefix, glyphs, suffix, self.find_lookup_builders_(lookups) - ) - ) - - def add_alternate_subst(self, location, prefix, glyph, suffix, replacement): - if self.cur_feature_name_ == "aalt": - alts = self.aalt_alternates_.setdefault(glyph, set()) - alts.update(replacement) - return - if prefix or suffix: - chain = self.get_lookup_(location, ChainContextSubstBuilder) - lookup = self.get_chained_lookup_(location, AlternateSubstBuilder) - chain.rules.append(ChainContextualRule(prefix, [{glyph}], suffix, [lookup])) - else: - lookup = self.get_lookup_(location, AlternateSubstBuilder) - if glyph in lookup.alternates: - raise FeatureLibError( - 'Already defined alternates for glyph "%s"' % glyph, location - ) - lookup.alternates[glyph] = replacement - def add_feature_reference(self, location, featureName): if self.cur_feature_name_ != "aalt": raise FeatureLibError( @@ -1207,24 +1239,38 @@ class Builder(object): key = (script, lang, self.cur_feature_name_) self.features_.setdefault(key, []) - def add_ligature_subst( - self, location, prefix, glyphs, suffix, replacement, forceChain - ): - if prefix or suffix or forceChain: - chain = self.get_lookup_(location, ChainContextSubstBuilder) - lookup = self.get_chained_lookup_(location, LigatureSubstBuilder) - chain.rules.append(ChainContextualRule(prefix, glyphs, suffix, [lookup])) - else: - lookup = self.get_lookup_(location, LigatureSubstBuilder) + # GSUB rules - # OpenType feature file syntax, section 5.d, "Ligature substitution": - # "Since the OpenType specification does not allow ligature - # substitutions to be specified on target sequences that contain - # glyph classes, the implementation software will enumerate - # all specific glyph sequences if glyph classes are detected" - for g in sorted(itertools.product(*glyphs)): - lookup.ligatures[g] = replacement + # GSUB 1 + def add_single_subst(self, location, prefix, suffix, mapping, forceChain): + if self.cur_feature_name_ == "aalt": + for (from_glyph, to_glyph) in mapping.items(): + alts = self.aalt_alternates_.setdefault(from_glyph, set()) + alts.add(to_glyph) + return + if prefix or suffix or forceChain: + self.add_single_subst_chained_(location, prefix, suffix, mapping) + return + lookup = self.get_lookup_(location, SingleSubstBuilder) + for (from_glyph, to_glyph) in mapping.items(): + if from_glyph in lookup.mapping: + if to_glyph == lookup.mapping[from_glyph]: + log.info( + "Removing duplicate single substitution from glyph" + ' "%s" to "%s" at %s', + from_glyph, + to_glyph, + location, + ) + else: + raise FeatureLibError( + 'Already defined rule for replacing glyph "%s" by "%s"' + % (from_glyph, lookup.mapping[from_glyph]), + location, + ) + lookup.mapping[from_glyph] = to_glyph + # GSUB 2 def add_multiple_subst( self, location, prefix, glyph, suffix, replacements, forceChain=False ): @@ -1250,39 +1296,61 @@ class Builder(object): ) lookup.mapping[glyph] = replacements - def add_reverse_chain_single_subst(self, location, old_prefix, old_suffix, mapping): - lookup = self.get_lookup_(location, ReverseChainSingleSubstBuilder) - lookup.rules.append((old_prefix, old_suffix, mapping)) - - def add_single_subst(self, location, prefix, suffix, mapping, forceChain): + # GSUB 3 + def add_alternate_subst(self, location, prefix, glyph, suffix, replacement): if self.cur_feature_name_ == "aalt": - for (from_glyph, to_glyph) in mapping.items(): - alts = self.aalt_alternates_.setdefault(from_glyph, set()) - alts.add(to_glyph) + alts = self.aalt_alternates_.setdefault(glyph, set()) + alts.update(replacement) return + if prefix or suffix: + chain = self.get_lookup_(location, ChainContextSubstBuilder) + lookup = self.get_chained_lookup_(location, AlternateSubstBuilder) + chain.rules.append(ChainContextualRule(prefix, [{glyph}], suffix, [lookup])) + else: + lookup = self.get_lookup_(location, AlternateSubstBuilder) + if glyph in lookup.alternates: + raise FeatureLibError( + 'Already defined alternates for glyph "%s"' % glyph, location + ) + # We allow empty replacement glyphs here. + lookup.alternates[glyph] = replacement + + # GSUB 4 + def add_ligature_subst( + self, location, prefix, glyphs, suffix, replacement, forceChain + ): if prefix or suffix or forceChain: - self.add_single_subst_chained_(location, prefix, suffix, mapping) - return - lookup = self.get_lookup_(location, SingleSubstBuilder) - for (from_glyph, to_glyph) in mapping.items(): - if from_glyph in lookup.mapping: - if to_glyph == lookup.mapping[from_glyph]: - log.info( - "Removing duplicate single substitution from glyph" - ' "%s" to "%s" at %s', - from_glyph, - to_glyph, - location, - ) - else: - raise FeatureLibError( - 'Already defined rule for replacing glyph "%s" by "%s"' - % (from_glyph, lookup.mapping[from_glyph]), - location, - ) - lookup.mapping[from_glyph] = to_glyph + chain = self.get_lookup_(location, ChainContextSubstBuilder) + lookup = self.get_chained_lookup_(location, LigatureSubstBuilder) + chain.rules.append(ChainContextualRule(prefix, glyphs, suffix, [lookup])) + else: + lookup = self.get_lookup_(location, LigatureSubstBuilder) + + if not all(glyphs): + raise FeatureLibError("Empty glyph class in substitution", location) + + # OpenType feature file syntax, section 5.d, "Ligature substitution": + # "Since the OpenType specification does not allow ligature + # substitutions to be specified on target sequences that contain + # glyph classes, the implementation software will enumerate + # all specific glyph sequences if glyph classes are detected" + for g in sorted(itertools.product(*glyphs)): + lookup.ligatures[g] = replacement + + # GSUB 5/6 + def add_chain_context_subst(self, location, prefix, glyphs, suffix, lookups): + if not all(glyphs) or not all(prefix) or not all(suffix): + raise FeatureLibError("Empty glyph class in contextual substitution", location) + lookup = self.get_lookup_(location, ChainContextSubstBuilder) + lookup.rules.append( + ChainContextualRule( + prefix, glyphs, suffix, self.find_lookup_builders_(lookups) + ) + ) def add_single_subst_chained_(self, location, prefix, suffix, mapping): + if not mapping or not all(prefix) or not all(suffix): + raise FeatureLibError("Empty glyph class in contextual substitution", location) # https://github.com/fonttools/fonttools/issues/512 chain = self.get_lookup_(location, ChainContextSubstBuilder) sub = chain.find_chainable_single_subst(set(mapping.keys())) @@ -1293,91 +1361,115 @@ class Builder(object): ChainContextualRule(prefix, [list(mapping.keys())], suffix, [sub]) ) + # GSUB 8 + def add_reverse_chain_single_subst(self, location, old_prefix, old_suffix, mapping): + if not mapping: + raise FeatureLibError("Empty glyph class in substitution", location) + lookup = self.get_lookup_(location, ReverseChainSingleSubstBuilder) + lookup.rules.append((old_prefix, old_suffix, mapping)) + + # GPOS rules + + # GPOS 1 + def add_single_pos(self, location, prefix, suffix, pos, forceChain): + if prefix or suffix or forceChain: + self.add_single_pos_chained_(location, prefix, suffix, pos) + else: + lookup = self.get_lookup_(location, SinglePosBuilder) + for glyphs, value in pos: + if not glyphs: + raise FeatureLibError("Empty glyph class in positioning rule", location) + otValueRecord = self.makeOpenTypeValueRecord(location, value, pairPosContext=False) + for glyph in glyphs: + try: + lookup.add_pos(location, glyph, otValueRecord) + except OpenTypeLibError as e: + raise FeatureLibError(str(e), e.location) from e + + # GPOS 2 + def add_class_pair_pos(self, location, glyphclass1, value1, glyphclass2, value2): + if not glyphclass1 or not glyphclass2: + raise FeatureLibError( + "Empty glyph class in positioning rule", location + ) + lookup = self.get_lookup_(location, PairPosBuilder) + v1 = self.makeOpenTypeValueRecord(location, value1, pairPosContext=True) + v2 = self.makeOpenTypeValueRecord(location, value2, pairPosContext=True) + lookup.addClassPair(location, glyphclass1, v1, glyphclass2, v2) + + def add_specific_pair_pos(self, location, glyph1, value1, glyph2, value2): + if not glyph1 or not glyph2: + raise FeatureLibError("Empty glyph class in positioning rule", location) + lookup = self.get_lookup_(location, PairPosBuilder) + v1 = self.makeOpenTypeValueRecord(location, value1, pairPosContext=True) + v2 = self.makeOpenTypeValueRecord(location, value2, pairPosContext=True) + lookup.addGlyphPair(location, glyph1, v1, glyph2, v2) + + # GPOS 3 def add_cursive_pos(self, location, glyphclass, entryAnchor, exitAnchor): + if not glyphclass: + raise FeatureLibError("Empty glyph class in positioning rule", location) lookup = self.get_lookup_(location, CursivePosBuilder) lookup.add_attachment( location, glyphclass, - makeOpenTypeAnchor(entryAnchor), - makeOpenTypeAnchor(exitAnchor), + self.makeOpenTypeAnchor(location, entryAnchor), + self.makeOpenTypeAnchor(location, exitAnchor), ) - def add_marks_(self, location, lookupBuilder, marks): - """Helper for add_mark_{base,liga,mark}_pos.""" - for _, markClass in marks: - for markClassDef in markClass.definitions: - for mark in markClassDef.glyphs.glyphSet(): - if mark not in lookupBuilder.marks: - otMarkAnchor = makeOpenTypeAnchor(markClassDef.anchor) - lookupBuilder.marks[mark] = (markClass.name, otMarkAnchor) - else: - existingMarkClass = lookupBuilder.marks[mark][0] - if markClass.name != existingMarkClass: - raise FeatureLibError( - "Glyph %s cannot be in both @%s and @%s" - % (mark, existingMarkClass, markClass.name), - location, - ) - + # GPOS 4 def add_mark_base_pos(self, location, bases, marks): builder = self.get_lookup_(location, MarkBasePosBuilder) self.add_marks_(location, builder, marks) + if not bases: + raise FeatureLibError("Empty glyph class in positioning rule", location) for baseAnchor, markClass in marks: - otBaseAnchor = makeOpenTypeAnchor(baseAnchor) + otBaseAnchor = self.makeOpenTypeAnchor(location, baseAnchor) for base in bases: builder.bases.setdefault(base, {})[markClass.name] = otBaseAnchor + # GPOS 5 def add_mark_lig_pos(self, location, ligatures, components): builder = self.get_lookup_(location, MarkLigPosBuilder) componentAnchors = [] + if not ligatures: + raise FeatureLibError("Empty glyph class in positioning rule", location) for marks in components: anchors = {} self.add_marks_(location, builder, marks) for ligAnchor, markClass in marks: - anchors[markClass.name] = makeOpenTypeAnchor(ligAnchor) + anchors[markClass.name] = self.makeOpenTypeAnchor(location, ligAnchor) componentAnchors.append(anchors) for glyph in ligatures: builder.ligatures[glyph] = componentAnchors + # GPOS 6 def add_mark_mark_pos(self, location, baseMarks, marks): builder = self.get_lookup_(location, MarkMarkPosBuilder) self.add_marks_(location, builder, marks) + if not baseMarks: + raise FeatureLibError("Empty glyph class in positioning rule", location) for baseAnchor, markClass in marks: - otBaseAnchor = makeOpenTypeAnchor(baseAnchor) + otBaseAnchor = self.makeOpenTypeAnchor(location, baseAnchor) for baseMark in baseMarks: builder.baseMarks.setdefault(baseMark, {})[ markClass.name ] = otBaseAnchor - def add_class_pair_pos(self, location, glyphclass1, value1, glyphclass2, value2): - lookup = self.get_lookup_(location, PairPosBuilder) - v1 = makeOpenTypeValueRecord(value1, pairPosContext=True) - v2 = makeOpenTypeValueRecord(value2, pairPosContext=True) - lookup.addClassPair(location, glyphclass1, v1, glyphclass2, v2) - - def add_subtable_break(self, location): - self.cur_lookup_.add_subtable_break(location) - - def add_specific_pair_pos(self, location, glyph1, value1, glyph2, value2): - lookup = self.get_lookup_(location, PairPosBuilder) - v1 = makeOpenTypeValueRecord(value1, pairPosContext=True) - v2 = makeOpenTypeValueRecord(value2, pairPosContext=True) - lookup.addGlyphPair(location, glyph1, v1, glyph2, v2) - - def add_single_pos(self, location, prefix, suffix, pos, forceChain): - if prefix or suffix or forceChain: - self.add_single_pos_chained_(location, prefix, suffix, pos) - else: - lookup = self.get_lookup_(location, SinglePosBuilder) - for glyphs, value in pos: - otValueRecord = makeOpenTypeValueRecord(value, pairPosContext=False) - for glyph in glyphs: - try: - lookup.add_pos(location, glyph, otValueRecord) - except OpenTypeLibError as e: - raise FeatureLibError(str(e), e.location) from e + # GPOS 7/8 + def add_chain_context_pos(self, location, prefix, glyphs, suffix, lookups): + if not all(glyphs) or not all(prefix) or not all(suffix): + raise FeatureLibError("Empty glyph class in contextual positioning rule", location) + lookup = self.get_lookup_(location, ChainContextPosBuilder) + lookup.rules.append( + ChainContextualRule( + prefix, glyphs, suffix, self.find_lookup_builders_(lookups) + ) + ) def add_single_pos_chained_(self, location, prefix, suffix, pos): + if not pos or not all(prefix) or not all(suffix): + raise FeatureLibError("Empty glyph class in contextual positioning rule", location) # https://github.com/fonttools/fonttools/issues/514 chain = self.get_lookup_(location, ChainContextPosBuilder) targets = [] @@ -1388,7 +1480,7 @@ class Builder(object): if value is None: subs.append(None) continue - otValue = makeOpenTypeValueRecord(value, pairPosContext=False) + otValue = self.makeOpenTypeValueRecord(location, value, pairPosContext=False) sub = chain.find_chainable_single_pos(targets, glyphs, otValue) if sub is None: sub = self.get_chained_lookup_(location, SinglePosBuilder) @@ -1401,6 +1493,26 @@ class Builder(object): ChainContextualRule(prefix, [g for g, v in pos], suffix, subs) ) + def add_marks_(self, location, lookupBuilder, marks): + """Helper for add_mark_{base,liga,mark}_pos.""" + for _, markClass in marks: + for markClassDef in markClass.definitions: + for mark in markClassDef.glyphs.glyphSet(): + if mark not in lookupBuilder.marks: + otMarkAnchor = self.makeOpenTypeAnchor(location, markClassDef.anchor) + lookupBuilder.marks[mark] = (markClass.name, otMarkAnchor) + else: + existingMarkClass = lookupBuilder.marks[mark][0] + if markClass.name != existingMarkClass: + raise FeatureLibError( + "Glyph %s cannot be in both @%s and @%s" + % (mark, existingMarkClass, markClass.name), + location, + ) + + def add_subtable_break(self, location): + self.cur_lookup_.add_subtable_break(location) + def setGlyphClass_(self, location, glyph, glyphClass): oldClass, oldLocation = self.glyphClassDefs_.get(glyph, (None, None)) if oldClass and oldClass != glyphClass: @@ -1445,37 +1557,98 @@ class Builder(object): def add_vhea_field(self, key, value): self.vhea_[key] = value + def add_conditionset(self, key, value): + if not "fvar" in self.font: + raise FeatureLibError( + "Cannot add feature variations to a font without an 'fvar' table" + ) + + # Normalize + axisMap = { + axis.axisTag: (axis.minValue, axis.defaultValue, axis.maxValue) + for axis in self.axes + } -def makeOpenTypeAnchor(anchor): - """ast.Anchor --> otTables.Anchor""" - if anchor is None: - return None - deviceX, deviceY = None, None - if anchor.xDeviceTable is not None: - deviceX = otl.buildDevice(dict(anchor.xDeviceTable)) - if anchor.yDeviceTable is not None: - deviceY = otl.buildDevice(dict(anchor.yDeviceTable)) - return otl.buildAnchor(anchor.x, anchor.y, anchor.contourpoint, deviceX, deviceY) + value = { + tag: ( + normalizeValue(bottom, axisMap[tag]), + normalizeValue(top, axisMap[tag]), + ) + for tag, (bottom, top) in value.items() + } + + self.conditionsets_[key] = value + + def makeOpenTypeAnchor(self, location, anchor): + """ast.Anchor --> otTables.Anchor""" + if anchor is None: + return None + variable = False + deviceX, deviceY = None, None + if anchor.xDeviceTable is not None: + deviceX = otl.buildDevice(dict(anchor.xDeviceTable)) + if anchor.yDeviceTable is not None: + deviceY = otl.buildDevice(dict(anchor.yDeviceTable)) + for dim in ("x", "y"): + if not isinstance(getattr(anchor, dim), VariableScalar): + continue + if getattr(anchor, dim+"DeviceTable") is not None: + raise FeatureLibError("Can't define a device coordinate and variable scalar", location) + if not self.varstorebuilder: + raise FeatureLibError("Can't define a variable scalar in a non-variable font", location) + varscalar = getattr(anchor,dim) + varscalar.axes = self.axes + default, index = varscalar.add_to_variation_store(self.varstorebuilder) + setattr(anchor, dim, default) + if index is not None and index != 0xFFFFFFFF: + if dim == "x": + deviceX = buildVarDevTable(index) + else: + deviceY = buildVarDevTable(index) + variable = True + otlanchor = otl.buildAnchor(anchor.x, anchor.y, anchor.contourpoint, deviceX, deviceY) + if variable: + otlanchor.Format = 3 + return otlanchor -_VALUEREC_ATTRS = { - name[0].lower() + name[1:]: (name, isDevice) - for _, name, isDevice, _ in otBase.valueRecordFormat - if not name.startswith("Reserved") -} + _VALUEREC_ATTRS = { + name[0].lower() + name[1:]: (name, isDevice) + for _, name, isDevice, _ in otBase.valueRecordFormat + if not name.startswith("Reserved") + } -def makeOpenTypeValueRecord(v, pairPosContext): - """ast.ValueRecord --> otBase.ValueRecord""" - if not v: - return None + def makeOpenTypeValueRecord(self, location, v, pairPosContext): + """ast.ValueRecord --> otBase.ValueRecord""" + if not v: + return None + + vr = {} + variable = False + for astName, (otName, isDevice) in self._VALUEREC_ATTRS.items(): + val = getattr(v, astName, None) + if not val: + continue + if isDevice: + vr[otName] = otl.buildDevice(dict(val)) + elif isinstance(val, VariableScalar): + otDeviceName = otName[0:4] + "Device" + feaDeviceName = otDeviceName[0].lower() + otDeviceName[1:] + if getattr(v, feaDeviceName): + raise FeatureLibError("Can't define a device coordinate and variable scalar", location) + if not self.varstorebuilder: + raise FeatureLibError("Can't define a variable scalar in a non-variable font", location) + val.axes = self.axes + default, index = val.add_to_variation_store(self.varstorebuilder) + vr[otName] = default + if index is not None and index != 0xFFFFFFFF: + vr[otDeviceName] = buildVarDevTable(index) + variable = True + else: + vr[otName] = val - vr = {} - for astName, (otName, isDevice) in _VALUEREC_ATTRS.items(): - val = getattr(v, astName, None) - if val: - vr[otName] = otl.buildDevice(dict(val)) if isDevice else val - if pairPosContext and not vr: - vr = {"YAdvance": 0} if v.vertical else {"XAdvance": 0} - valRec = otl.buildValue(vr) - return valRec + if pairPosContext and not vr: + vr = {"YAdvance": 0} if v.vertical else {"XAdvance": 0} + valRec = otl.buildValue(vr) + return valRec diff --git a/Lib/fontTools/feaLib/parser.py b/Lib/fontTools/feaLib/parser.py index 804cba9f..fd53573d 100644 --- a/Lib/fontTools/feaLib/parser.py +++ b/Lib/fontTools/feaLib/parser.py @@ -1,7 +1,8 @@ from fontTools.feaLib.error import FeatureLibError from fontTools.feaLib.lexer import Lexer, IncludingLexer, NonIncludingLexer +from fontTools.feaLib.variableScalar import VariableScalar from fontTools.misc.encodingTools import getEncoding -from fontTools.misc.py23 import bytechr, tobytes, tostr +from fontTools.misc.textTools import bytechr, tobytes, tostr import fontTools.feaLib.ast as ast import logging import os @@ -101,6 +102,10 @@ class Parser(object): statements.append(self.parse_markClass_()) elif self.is_cur_keyword_("feature"): statements.append(self.parse_feature_block_()) + elif self.is_cur_keyword_("conditionset"): + statements.append(self.parse_conditionset_()) + elif self.is_cur_keyword_("variation"): + statements.append(self.parse_feature_block_(variation=True)) elif self.is_cur_keyword_("table"): statements.append(self.parse_table_()) elif self.is_cur_keyword_("valueRecordDef"): @@ -152,7 +157,7 @@ class Parser(object): location=location, ) - x, y = self.expect_number_(), self.expect_number_() + x, y = self.expect_number_(variable=True), self.expect_number_(variable=True) contourpoint = None if self.next_token_ == "contourpoint": # Format B @@ -380,8 +385,7 @@ class Parser(object): self.expect_symbol_("-") range_end = self.expect_cid_() self.check_glyph_name_in_glyph_set( - f"cid{range_start:05d}", - f"cid{range_end:05d}", + f"cid{range_start:05d}", f"cid{range_end:05d}", ) glyphs.add_cid_range( range_start, @@ -473,14 +477,38 @@ class Parser(object): assert lookups == [] return ([], prefix, [None] * len(prefix), values, [], hasMarks) else: - assert not any(values[: len(prefix)]), values - format1 = values[len(prefix) :][: len(glyphs)] - format2 = values[(len(prefix) + len(glyphs)) :][: len(suffix)] - values = ( - format2 - if format2 and isinstance(format2[0], self.ast.ValueRecord) - else format1 - ) + if any(values[: len(prefix)]): + raise FeatureLibError( + "Positioning cannot be applied in the bactrack glyph sequence, " + "before the marked glyph sequence.", + self.cur_token_location_, + ) + marked_values = values[len(prefix) : len(prefix) + len(glyphs)] + if any(marked_values): + if any(values[len(prefix) + len(glyphs) :]): + raise FeatureLibError( + "Positioning values are allowed only in the marked glyph " + "sequence, or after the final glyph node when only one glyph " + "node is marked.", + self.cur_token_location_, + ) + values = marked_values + elif values and values[-1]: + if len(glyphs) > 1 or any(values[:-1]): + raise FeatureLibError( + "Positioning values are allowed only in the marked glyph " + "sequence, or after the final glyph node when only one glyph " + "node is marked.", + self.cur_token_location_, + ) + values = values[-1:] + elif any(values): + raise FeatureLibError( + "Positioning values are allowed only in the marked glyph " + "sequence, or after the final glyph node when only one glyph " + "node is marked.", + self.cur_token_location_, + ) return (prefix, glyphs, lookups, values, suffix, hasMarks) def parse_chain_context_(self): @@ -656,6 +684,8 @@ class Parser(object): assert self.is_cur_keyword_("markClass") location = self.cur_token_location_ glyphs = self.parse_glyphclass_(accept_glyphname=True) + if not glyphs.glyphSet(): + raise FeatureLibError("Empty glyph class in mark class definition", location) anchor = self.parse_anchor_() name = self.expect_class_name_() self.expect_symbol_(";") @@ -844,7 +874,7 @@ class Parser(object): num_lookups = len([l for l in lookups if l is not None]) is_deletion = False - if len(new) == 1 and len(new[0].glyphSet()) == 0: + if len(new) == 1 and isinstance(new[0], ast.NullGlyph): new = [] # Deletion is_deletion = True @@ -868,18 +898,31 @@ class Parser(object): old, new, old_prefix, old_suffix, forceChain=hasMarks, location=location ) + # Glyph deletion, built as GSUB lookup type 2: Multiple substitution + # with empty replacement. + if is_deletion and len(old) == 1 and num_lookups == 0: + return self.ast.MultipleSubstStatement( + old_prefix, + old[0], + old_suffix, + (), + forceChain=hasMarks, + location=location, + ) + # GSUB lookup type 2: Multiple substitution. # Format: "substitute f_f_i by f f i;" if ( not reverse and len(old) == 1 and len(old[0].glyphSet()) == 1 - and ( - (len(new) > 1 and max([len(n.glyphSet()) for n in new]) == 1) - or len(new) == 0 - ) + and len(new) > 1 + and max([len(n.glyphSet()) for n in new]) == 1 and num_lookups == 0 ): + for n in new: + if not list(n.glyphSet()): + raise FeatureLibError("Empty class in replacement", location) return self.ast.MultipleSubstStatement( old_prefix, tuple(old[0].glyphSet())[0], @@ -971,8 +1014,8 @@ class Parser(object): location = self.cur_token_location_ DesignSize = self.expect_decipoint_() SubfamilyID = self.expect_number_() - RangeStart = 0. - RangeEnd = 0. + RangeStart = 0.0 + RangeEnd = 0.0 if self.next_token_type_ in (Lexer.NUMBER, Lexer.FLOAT) or SubfamilyID != 0: RangeStart = self.expect_decipoint_() RangeEnd = self.expect_decipoint_() @@ -1551,11 +1594,20 @@ class Parser(object): return result def is_next_value_(self): - return self.next_token_type_ is Lexer.NUMBER or self.next_token_ == "<" + return ( + self.next_token_type_ is Lexer.NUMBER + or self.next_token_ == "<" + or self.next_token_ == "(" + ) def parse_valuerecord_(self, vertical): - if self.next_token_type_ is Lexer.NUMBER: - number, location = self.expect_number_(), self.cur_token_location_ + if ( + self.next_token_type_ is Lexer.SYMBOL and self.next_token_ == "(" + ) or self.next_token_type_ is Lexer.NUMBER: + number, location = ( + self.expect_number_(variable=True), + self.cur_token_location_, + ) if vertical: val = self.ast.ValueRecord( yAdvance=number, vertical=vertical, location=location @@ -1582,10 +1634,10 @@ class Parser(object): xAdvance, yAdvance = (value.xAdvance, value.yAdvance) else: xPlacement, yPlacement, xAdvance, yAdvance = ( - self.expect_number_(), - self.expect_number_(), - self.expect_number_(), - self.expect_number_(), + self.expect_number_(variable=True), + self.expect_number_(variable=True), + self.expect_number_(variable=True), + self.expect_number_(variable=True), ) if self.next_token_ == "<": @@ -1645,8 +1697,11 @@ class Parser(object): self.expect_symbol_(";") return self.ast.LanguageSystemStatement(script, language, location=location) - def parse_feature_block_(self): - assert self.cur_token_ == "feature" + def parse_feature_block_(self, variation=False): + if variation: + assert self.cur_token_ == "variation" + else: + assert self.cur_token_ == "feature" location = self.cur_token_location_ tag = self.expect_tag_() vertical = tag in {"vkrn", "vpal", "vhal", "valt"} @@ -1661,14 +1716,22 @@ class Parser(object): elif tag == "size": size_feature = True + if variation: + conditionset = self.expect_name_() + use_extension = False if self.next_token_ == "useExtension": self.expect_keyword_("useExtension") use_extension = True - block = self.ast.FeatureBlock( - tag, use_extension=use_extension, location=location - ) + if variation: + block = self.ast.VariationBlock( + tag, conditionset, use_extension=use_extension, location=location + ) + else: + block = self.ast.FeatureBlock( + tag, use_extension=use_extension, location=location + ) self.parse_block_(block, vertical, stylisticset, size_feature, cv_feature) return block @@ -1816,6 +1879,43 @@ class Parser(object): raise FeatureLibError("Font revision numbers must be positive", location) return self.ast.FontRevisionStatement(version, location=location) + def parse_conditionset_(self): + name = self.expect_name_() + + conditions = {} + self.expect_symbol_("{") + + while self.next_token_ != "}": + self.advance_lexer_() + if self.cur_token_type_ is not Lexer.NAME: + raise FeatureLibError("Expected an axis name", self.cur_token_location_) + + axis = self.cur_token_ + if axis in conditions: + raise FeatureLibError( + f"Repeated condition for axis {axis}", self.cur_token_location_ + ) + + if self.next_token_type_ is Lexer.FLOAT: + min_value = self.expect_float_() + elif self.next_token_type_ is Lexer.NUMBER: + min_value = self.expect_number_(variable=False) + + if self.next_token_type_ is Lexer.FLOAT: + max_value = self.expect_float_() + elif self.next_token_type_ is Lexer.NUMBER: + max_value = self.expect_number_(variable=False) + self.expect_symbol_(";") + + conditions[axis] = (min_value, max_value) + + self.expect_symbol_("}") + + finalname = self.expect_name_() + if finalname != name: + raise FeatureLibError('Expected "%s"' % name, self.cur_token_location_) + return self.ast.ConditionsetStatement(name, conditions) + def parse_block_( self, block, vertical, stylisticset=None, size_feature=False, cv_feature=None ): @@ -2046,12 +2146,51 @@ class Parser(object): return self.cur_token_ raise FeatureLibError("Expected a name", self.cur_token_location_) - def expect_number_(self): + def expect_number_(self, variable=False): self.advance_lexer_() if self.cur_token_type_ is Lexer.NUMBER: return self.cur_token_ + if variable and self.cur_token_type_ is Lexer.SYMBOL and self.cur_token_ == "(": + return self.expect_variable_scalar_() raise FeatureLibError("Expected a number", self.cur_token_location_) + def expect_variable_scalar_(self): + self.advance_lexer_() # "(" + scalar = VariableScalar() + while True: + if self.cur_token_type_ == Lexer.SYMBOL and self.cur_token_ == ")": + break + location, value = self.expect_master_() + scalar.add_value(location, value) + return scalar + + def expect_master_(self): + location = {} + while True: + if self.cur_token_type_ is not Lexer.NAME: + raise FeatureLibError("Expected an axis name", self.cur_token_location_) + axis = self.cur_token_ + self.advance_lexer_() + if not (self.cur_token_type_ is Lexer.SYMBOL and self.cur_token_ == "="): + raise FeatureLibError( + "Expected an equals sign", self.cur_token_location_ + ) + value = self.expect_number_() + location[axis] = value + if self.next_token_type_ is Lexer.NAME and self.next_token_[0] == ":": + # Lexer has just read the value as a glyph name. We'll correct it later + break + self.advance_lexer_() + if not (self.cur_token_type_ is Lexer.SYMBOL and self.cur_token_ == ","): + raise FeatureLibError( + "Expected an comma or an equals sign", self.cur_token_location_ + ) + self.advance_lexer_() + self.advance_lexer_() + value = int(self.cur_token_[1:]) + self.advance_lexer_() + return location, value + def expect_any_number_(self): self.advance_lexer_() if self.cur_token_type_ in Lexer.NUMBERS: diff --git a/Lib/fontTools/feaLib/variableScalar.py b/Lib/fontTools/feaLib/variableScalar.py new file mode 100644 index 00000000..a286568e --- /dev/null +++ b/Lib/fontTools/feaLib/variableScalar.py @@ -0,0 +1,97 @@ +from fontTools.varLib.models import VariationModel, normalizeValue + + +def Location(loc): + return tuple(sorted(loc.items())) + + +class VariableScalar: + """A scalar with different values at different points in the designspace.""" + + def __init__(self, location_value={}): + self.values = {} + self.axes = {} + for location, value in location_value.items(): + self.add_value(location, value) + + def __repr__(self): + items = [] + for location, value in self.values.items(): + loc = ",".join(["%s=%i" % (ax, loc) for ax, loc in location]) + items.append("%s:%i" % (loc, value)) + return "(" + (" ".join(items)) + ")" + + @property + def does_vary(self): + values = list(self.values.values()) + return any(v != values[0] for v in values[1:]) + + @property + def axes_dict(self): + if not self.axes: + raise ValueError( + ".axes must be defined on variable scalar before interpolating" + ) + return {ax.axisTag: ax for ax in self.axes} + + def _normalized_location(self, location): + location = self.fix_location(location) + normalized_location = {} + for axtag in location.keys(): + if axtag not in self.axes_dict: + raise ValueError("Unknown axis %s in %s" % (axtag, location)) + axis = self.axes_dict[axtag] + normalized_location[axtag] = normalizeValue( + location[axtag], (axis.minValue, axis.defaultValue, axis.maxValue) + ) + + return Location(normalized_location) + + def fix_location(self, location): + location = dict(location) + for tag, axis in self.axes_dict.items(): + if tag not in location: + location[tag] = axis.defaultValue + return location + + def add_value(self, location, value): + if self.axes: + location = self.fix_location(location) + + self.values[Location(location)] = value + + def fix_all_locations(self): + self.values = { + Location(self.fix_location(l)): v for l, v in self.values.items() + } + + @property + def default(self): + self.fix_all_locations() + key = Location({ax.axisTag: ax.defaultValue for ax in self.axes}) + if key not in self.values: + raise ValueError("Default value could not be found") + # I *guess* we could interpolate one, but I don't know how. + return self.values[key] + + def value_at_location(self, location): + loc = location + if loc in self.values.keys(): + return self.values[loc] + values = list(self.values.values()) + return self.model.interpolateFromMasters(loc, values) + + @property + def model(self): + locations = [dict(self._normalized_location(k)) for k in self.values.keys()] + return VariationModel(locations) + + def get_deltas_and_supports(self): + values = list(self.values.values()) + return self.model.getDeltasAndSupports(values) + + def add_to_variation_store(self, store_builder): + deltas, supports = self.get_deltas_and_supports() + store_builder.setSupports(supports) + index = store_builder.storeDeltas(deltas) + return int(self.default), index diff --git a/Lib/fontTools/fontBuilder.py b/Lib/fontTools/fontBuilder.py index e2824084..bf3b31b7 100644 --- a/Lib/fontTools/fontBuilder.py +++ b/Lib/fontTools/fontBuilder.py @@ -834,7 +834,14 @@ class FontBuilder(object): self.font, conditionalSubstitutions, featureTag=featureTag ) - def setupCOLR(self, colorLayers, version=None, varStore=None): + def setupCOLR( + self, + colorLayers, + version=None, + varStore=None, + varIndexMap=None, + clipBoxes=None, + ): """Build new COLR table using color layers dictionary. Cf. `fontTools.colorLib.builder.buildCOLR`. @@ -843,7 +850,12 @@ class FontBuilder(object): glyphMap = self.font.getReverseGlyphMap() self.font["COLR"] = buildCOLR( - colorLayers, version=version, glyphMap=glyphMap, varStore=varStore + colorLayers, + version=version, + glyphMap=glyphMap, + varStore=varStore, + varIndexMap=varIndexMap, + clipBoxes=clipBoxes, ) def setupCPAL( diff --git a/Lib/fontTools/help.py b/Lib/fontTools/help.py index ff8048d5..4334e500 100644 --- a/Lib/fontTools/help.py +++ b/Lib/fontTools/help.py @@ -22,7 +22,8 @@ def main(): description = imports.main.__doc__ if description: pkg = pkg.replace("fontTools.", "").replace(".__main__", "") - descriptions[pkg] = description + # show the docstring's first line only + descriptions[pkg] = description.splitlines()[0] except AttributeError as e: pass for pkg, description in descriptions.items(): diff --git a/Lib/fontTools/merge.py b/Lib/fontTools/merge.py deleted file mode 100644 index 2df22a8d..00000000 --- a/Lib/fontTools/merge.py +++ /dev/null @@ -1,1205 +0,0 @@ -# Copyright 2013 Google, Inc. All Rights Reserved. -# -# Google Author(s): Behdad Esfahbod, Roozbeh Pournader - -from fontTools.misc.timeTools import timestampNow -from fontTools import ttLib, cffLib -from fontTools.ttLib.tables import otTables, _h_e_a_d -from fontTools.ttLib.tables.DefaultTable import DefaultTable -from fontTools.misc.loggingTools import Timer -from fontTools.pens.recordingPen import DecomposingRecordingPen -from functools import reduce -import sys -import time -import operator -import logging - - -log = logging.getLogger("fontTools.merge") -timer = Timer(logger=logging.getLogger(__name__+".timer"), level=logging.INFO) - - -def _add_method(*clazzes, **kwargs): - """Returns a decorator function that adds a new method to one or - more classes.""" - allowDefault = kwargs.get('allowDefaultTable', False) - def wrapper(method): - done = [] - for clazz in clazzes: - if clazz in done: continue # Support multiple names of a clazz - done.append(clazz) - assert allowDefault or clazz != DefaultTable, 'Oops, table class not found.' - assert method.__name__ not in clazz.__dict__, \ - "Oops, class '%s' has method '%s'." % (clazz.__name__, method.__name__) - setattr(clazz, method.__name__, method) - return None - return wrapper - -# General utility functions for merging values from different fonts - -def equal(lst): - lst = list(lst) - t = iter(lst) - first = next(t) - assert all(item == first for item in t), "Expected all items to be equal: %s" % lst - return first - -def first(lst): - return next(iter(lst)) - -def recalculate(lst): - return NotImplemented - -def current_time(lst): - return timestampNow() - -def bitwise_and(lst): - return reduce(operator.and_, lst) - -def bitwise_or(lst): - return reduce(operator.or_, lst) - -def avg_int(lst): - lst = list(lst) - return sum(lst) // len(lst) - -def onlyExisting(func): - """Returns a filter func that when called with a list, - only calls func on the non-NotImplemented items of the list, - and only so if there's at least one item remaining. - Otherwise returns NotImplemented.""" - - def wrapper(lst): - items = [item for item in lst if item is not NotImplemented] - return func(items) if items else NotImplemented - - return wrapper - -def sumLists(lst): - l = [] - for item in lst: - l.extend(item) - return l - -def sumDicts(lst): - d = {} - for item in lst: - d.update(item) - return d - -def mergeObjects(lst): - lst = [item for item in lst if item is not NotImplemented] - if not lst: - return NotImplemented - lst = [item for item in lst if item is not None] - if not lst: - return None - - clazz = lst[0].__class__ - assert all(type(item) == clazz for item in lst), lst - - logic = clazz.mergeMap - returnTable = clazz() - returnDict = {} - - allKeys = set.union(set(), *(vars(table).keys() for table in lst)) - for key in allKeys: - try: - mergeLogic = logic[key] - except KeyError: - try: - mergeLogic = logic['*'] - except KeyError: - raise Exception("Don't know how to merge key %s of class %s" % - (key, clazz.__name__)) - if mergeLogic is NotImplemented: - continue - value = mergeLogic(getattr(table, key, NotImplemented) for table in lst) - if value is not NotImplemented: - returnDict[key] = value - - returnTable.__dict__ = returnDict - - return returnTable - -def mergeBits(bitmap): - - def wrapper(lst): - lst = list(lst) - returnValue = 0 - for bitNumber in range(bitmap['size']): - try: - mergeLogic = bitmap[bitNumber] - except KeyError: - try: - mergeLogic = bitmap['*'] - except KeyError: - raise Exception("Don't know how to merge bit %s" % bitNumber) - shiftedBit = 1 << bitNumber - mergedValue = mergeLogic(bool(item & shiftedBit) for item in lst) - returnValue |= mergedValue << bitNumber - return returnValue - - return wrapper - - -@_add_method(DefaultTable, allowDefaultTable=True) -def merge(self, m, tables): - if not hasattr(self, 'mergeMap'): - log.info("Don't know how to merge '%s'.", self.tableTag) - return NotImplemented - - logic = self.mergeMap - - if isinstance(logic, dict): - return m.mergeObjects(self, self.mergeMap, tables) - else: - return logic(tables) - - -ttLib.getTableClass('maxp').mergeMap = { - '*': max, - 'tableTag': equal, - 'tableVersion': equal, - 'numGlyphs': sum, - 'maxStorage': first, - 'maxFunctionDefs': first, - 'maxInstructionDefs': first, - # TODO When we correctly merge hinting data, update these values: - # maxFunctionDefs, maxInstructionDefs, maxSizeOfInstructions -} - -headFlagsMergeBitMap = { - 'size': 16, - '*': bitwise_or, - 1: bitwise_and, # Baseline at y = 0 - 2: bitwise_and, # lsb at x = 0 - 3: bitwise_and, # Force ppem to integer values. FIXME? - 5: bitwise_and, # Font is vertical - 6: lambda bit: 0, # Always set to zero - 11: bitwise_and, # Font data is 'lossless' - 13: bitwise_and, # Optimized for ClearType - 14: bitwise_and, # Last resort font. FIXME? equal or first may be better - 15: lambda bit: 0, # Always set to zero -} - -ttLib.getTableClass('head').mergeMap = { - 'tableTag': equal, - 'tableVersion': max, - 'fontRevision': max, - 'checkSumAdjustment': lambda lst: 0, # We need *something* here - 'magicNumber': equal, - 'flags': mergeBits(headFlagsMergeBitMap), - 'unitsPerEm': equal, - 'created': current_time, - 'modified': current_time, - 'xMin': min, - 'yMin': min, - 'xMax': max, - 'yMax': max, - 'macStyle': first, - 'lowestRecPPEM': max, - 'fontDirectionHint': lambda lst: 2, - 'indexToLocFormat': recalculate, - 'glyphDataFormat': equal, -} - -ttLib.getTableClass('hhea').mergeMap = { - '*': equal, - 'tableTag': equal, - 'tableVersion': max, - 'ascent': max, - 'descent': min, - 'lineGap': max, - 'advanceWidthMax': max, - 'minLeftSideBearing': min, - 'minRightSideBearing': min, - 'xMaxExtent': max, - 'caretSlopeRise': first, - 'caretSlopeRun': first, - 'caretOffset': first, - 'numberOfHMetrics': recalculate, -} - -ttLib.getTableClass('vhea').mergeMap = { - '*': equal, - 'tableTag': equal, - 'tableVersion': max, - 'ascent': max, - 'descent': min, - 'lineGap': max, - 'advanceHeightMax': max, - 'minTopSideBearing': min, - 'minBottomSideBearing': min, - 'yMaxExtent': max, - 'caretSlopeRise': first, - 'caretSlopeRun': first, - 'caretOffset': first, - 'numberOfVMetrics': recalculate, -} - -os2FsTypeMergeBitMap = { - 'size': 16, - '*': lambda bit: 0, - 1: bitwise_or, # no embedding permitted - 2: bitwise_and, # allow previewing and printing documents - 3: bitwise_and, # allow editing documents - 8: bitwise_or, # no subsetting permitted - 9: bitwise_or, # no embedding of outlines permitted -} - -def mergeOs2FsType(lst): - lst = list(lst) - if all(item == 0 for item in lst): - return 0 - - # Compute least restrictive logic for each fsType value - for i in range(len(lst)): - # unset bit 1 (no embedding permitted) if either bit 2 or 3 is set - if lst[i] & 0x000C: - lst[i] &= ~0x0002 - # set bit 2 (allow previewing) if bit 3 is set (allow editing) - elif lst[i] & 0x0008: - lst[i] |= 0x0004 - # set bits 2 and 3 if everything is allowed - elif lst[i] == 0: - lst[i] = 0x000C - - fsType = mergeBits(os2FsTypeMergeBitMap)(lst) - # unset bits 2 and 3 if bit 1 is set (some font is "no embedding") - if fsType & 0x0002: - fsType &= ~0x000C - return fsType - - -ttLib.getTableClass('OS/2').mergeMap = { - '*': first, - 'tableTag': equal, - 'version': max, - 'xAvgCharWidth': avg_int, # Apparently fontTools doesn't recalc this - 'fsType': mergeOs2FsType, # Will be overwritten - 'panose': first, # FIXME: should really be the first Latin font - 'ulUnicodeRange1': bitwise_or, - 'ulUnicodeRange2': bitwise_or, - 'ulUnicodeRange3': bitwise_or, - 'ulUnicodeRange4': bitwise_or, - 'fsFirstCharIndex': min, - 'fsLastCharIndex': max, - 'sTypoAscender': max, - 'sTypoDescender': min, - 'sTypoLineGap': max, - 'usWinAscent': max, - 'usWinDescent': max, - # Version 1 - 'ulCodePageRange1': onlyExisting(bitwise_or), - 'ulCodePageRange2': onlyExisting(bitwise_or), - # Version 2, 3, 4 - 'sxHeight': onlyExisting(max), - 'sCapHeight': onlyExisting(max), - 'usDefaultChar': onlyExisting(first), - 'usBreakChar': onlyExisting(first), - 'usMaxContext': onlyExisting(max), - # version 5 - 'usLowerOpticalPointSize': onlyExisting(min), - 'usUpperOpticalPointSize': onlyExisting(max), -} - -@_add_method(ttLib.getTableClass('OS/2')) -def merge(self, m, tables): - DefaultTable.merge(self, m, tables) - if self.version < 2: - # bits 8 and 9 are reserved and should be set to zero - self.fsType &= ~0x0300 - if self.version >= 3: - # Only one of bits 1, 2, and 3 may be set. We already take - # care of bit 1 implications in mergeOs2FsType. So unset - # bit 2 if bit 3 is already set. - if self.fsType & 0x0008: - self.fsType &= ~0x0004 - return self - -ttLib.getTableClass('post').mergeMap = { - '*': first, - 'tableTag': equal, - 'formatType': max, - 'isFixedPitch': min, - 'minMemType42': max, - 'maxMemType42': lambda lst: 0, - 'minMemType1': max, - 'maxMemType1': lambda lst: 0, - 'mapping': onlyExisting(sumDicts), - 'extraNames': lambda lst: [], -} - -ttLib.getTableClass('vmtx').mergeMap = ttLib.getTableClass('hmtx').mergeMap = { - 'tableTag': equal, - 'metrics': sumDicts, -} - -ttLib.getTableClass('name').mergeMap = { - 'tableTag': equal, - 'names': first, # FIXME? Does mixing name records make sense? -} - -ttLib.getTableClass('loca').mergeMap = { - '*': recalculate, - 'tableTag': equal, -} - -ttLib.getTableClass('glyf').mergeMap = { - 'tableTag': equal, - 'glyphs': sumDicts, - 'glyphOrder': sumLists, -} - -@_add_method(ttLib.getTableClass('glyf')) -def merge(self, m, tables): - for i,table in enumerate(tables): - for g in table.glyphs.values(): - if i: - # Drop hints for all but first font, since - # we don't map functions / CVT values. - g.removeHinting() - # Expand composite glyphs to load their - # composite glyph names. - if g.isComposite(): - g.expand(table) - return DefaultTable.merge(self, m, tables) - -ttLib.getTableClass('prep').mergeMap = lambda self, lst: first(lst) -ttLib.getTableClass('fpgm').mergeMap = lambda self, lst: first(lst) -ttLib.getTableClass('cvt ').mergeMap = lambda self, lst: first(lst) -ttLib.getTableClass('gasp').mergeMap = lambda self, lst: first(lst) # FIXME? Appears irreconcilable - -def _glyphsAreSame(glyphSet1, glyphSet2, glyph1, glyph2): - pen1 = DecomposingRecordingPen(glyphSet1) - pen2 = DecomposingRecordingPen(glyphSet2) - g1 = glyphSet1[glyph1] - g2 = glyphSet2[glyph2] - g1.draw(pen1) - g2.draw(pen2) - return (pen1.value == pen2.value and - g1.width == g2.width and - (not hasattr(g1, 'height') or g1.height == g2.height)) - -# Valid (format, platformID, platEncID) triplets for cmap subtables containing -# Unicode BMP-only and Unicode Full Repertoire semantics. -# Cf. OpenType spec for "Platform specific encodings": -# https://docs.microsoft.com/en-us/typography/opentype/spec/name -class CmapUnicodePlatEncodings: - BMP = {(4, 3, 1), (4, 0, 3), (4, 0, 4), (4, 0, 6)} - FullRepertoire = {(12, 3, 10), (12, 0, 4), (12, 0, 6)} - -@_add_method(ttLib.getTableClass('cmap')) -def merge(self, m, tables): - # TODO Handle format=14. - # Only merge format 4 and 12 Unicode subtables, ignores all other subtables - # If there is a format 12 table for the same font, ignore the format 4 table - cmapTables = [] - for fontIdx,table in enumerate(tables): - format4 = None - format12 = None - for subtable in table.tables: - properties = (subtable.format, subtable.platformID, subtable.platEncID) - if properties in CmapUnicodePlatEncodings.BMP: - format4 = subtable - elif properties in CmapUnicodePlatEncodings.FullRepertoire: - format12 = subtable - else: - log.warning( - "Dropped cmap subtable from font [%s]:\t" - "format %2s, platformID %2s, platEncID %2s", - fontIdx, subtable.format, subtable.platformID, subtable.platEncID - ) - if format12 is not None: - cmapTables.append((format12, fontIdx)) - elif format4 is not None: - cmapTables.append((format4, fontIdx)) - - # Build a unicode mapping, then decide which format is needed to store it. - cmap = {} - fontIndexForGlyph = {} - glyphSets = [None for f in m.fonts] if hasattr(m, 'fonts') else None - for table,fontIdx in cmapTables: - # handle duplicates - for uni,gid in table.cmap.items(): - oldgid = cmap.get(uni, None) - if oldgid is None: - cmap[uni] = gid - fontIndexForGlyph[gid] = fontIdx - elif oldgid != gid: - # Char previously mapped to oldgid, now to gid. - # Record, to fix up in GSUB 'locl' later. - if m.duplicateGlyphsPerFont[fontIdx].get(oldgid) is None: - if glyphSets is not None: - oldFontIdx = fontIndexForGlyph[oldgid] - for idx in (fontIdx, oldFontIdx): - if glyphSets[idx] is None: - glyphSets[idx] = m.fonts[idx].getGlyphSet() - if _glyphsAreSame(glyphSets[oldFontIdx], glyphSets[fontIdx], oldgid, gid): - continue - m.duplicateGlyphsPerFont[fontIdx][oldgid] = gid - elif m.duplicateGlyphsPerFont[fontIdx][oldgid] != gid: - # Char previously mapped to oldgid but oldgid is already remapped to a different - # gid, because of another Unicode character. - # TODO: Try harder to do something about these. - log.warning("Dropped mapping from codepoint %#06X to glyphId '%s'", uni, gid) - - cmapBmpOnly = {uni: gid for uni,gid in cmap.items() if uni <= 0xFFFF} - self.tables = [] - module = ttLib.getTableModule('cmap') - if len(cmapBmpOnly) != len(cmap): - # format-12 required. - cmapTable = module.cmap_classes[12](12) - cmapTable.platformID = 3 - cmapTable.platEncID = 10 - cmapTable.language = 0 - cmapTable.cmap = cmap - self.tables.append(cmapTable) - # always create format-4 - cmapTable = module.cmap_classes[4](4) - cmapTable.platformID = 3 - cmapTable.platEncID = 1 - cmapTable.language = 0 - cmapTable.cmap = cmapBmpOnly - # ordered by platform then encoding - self.tables.insert(0, cmapTable) - self.tableVersion = 0 - self.numSubTables = len(self.tables) - return self - - -def mergeLookupLists(lst): - # TODO Do smarter merge. - return sumLists(lst) - -def mergeFeatures(lst): - assert lst - self = otTables.Feature() - self.FeatureParams = None - self.LookupListIndex = mergeLookupLists([l.LookupListIndex for l in lst if l.LookupListIndex]) - self.LookupCount = len(self.LookupListIndex) - return self - -def mergeFeatureLists(lst): - d = {} - for l in lst: - for f in l: - tag = f.FeatureTag - if tag not in d: - d[tag] = [] - d[tag].append(f.Feature) - ret = [] - for tag in sorted(d.keys()): - rec = otTables.FeatureRecord() - rec.FeatureTag = tag - rec.Feature = mergeFeatures(d[tag]) - ret.append(rec) - return ret - -def mergeLangSyses(lst): - assert lst - - # TODO Support merging ReqFeatureIndex - assert all(l.ReqFeatureIndex == 0xFFFF for l in lst) - - self = otTables.LangSys() - self.LookupOrder = None - self.ReqFeatureIndex = 0xFFFF - self.FeatureIndex = mergeFeatureLists([l.FeatureIndex for l in lst if l.FeatureIndex]) - self.FeatureCount = len(self.FeatureIndex) - return self - -def mergeScripts(lst): - assert lst - - if len(lst) == 1: - return lst[0] - langSyses = {} - for sr in lst: - for lsr in sr.LangSysRecord: - if lsr.LangSysTag not in langSyses: - langSyses[lsr.LangSysTag] = [] - langSyses[lsr.LangSysTag].append(lsr.LangSys) - lsrecords = [] - for tag, langSys_list in sorted(langSyses.items()): - lsr = otTables.LangSysRecord() - lsr.LangSys = mergeLangSyses(langSys_list) - lsr.LangSysTag = tag - lsrecords.append(lsr) - - self = otTables.Script() - self.LangSysRecord = lsrecords - self.LangSysCount = len(lsrecords) - dfltLangSyses = [s.DefaultLangSys for s in lst if s.DefaultLangSys] - if dfltLangSyses: - self.DefaultLangSys = mergeLangSyses(dfltLangSyses) - else: - self.DefaultLangSys = None - return self - -def mergeScriptRecords(lst): - d = {} - for l in lst: - for s in l: - tag = s.ScriptTag - if tag not in d: - d[tag] = [] - d[tag].append(s.Script) - ret = [] - for tag in sorted(d.keys()): - rec = otTables.ScriptRecord() - rec.ScriptTag = tag - rec.Script = mergeScripts(d[tag]) - ret.append(rec) - return ret - -otTables.ScriptList.mergeMap = { - 'ScriptCount': lambda lst: None, # TODO - 'ScriptRecord': mergeScriptRecords, -} -otTables.BaseScriptList.mergeMap = { - 'BaseScriptCount': lambda lst: None, # TODO - # TODO: Merge duplicate entries - 'BaseScriptRecord': lambda lst: sorted(sumLists(lst), key=lambda s: s.BaseScriptTag), -} - -otTables.FeatureList.mergeMap = { - 'FeatureCount': sum, - 'FeatureRecord': lambda lst: sorted(sumLists(lst), key=lambda s: s.FeatureTag), -} - -otTables.LookupList.mergeMap = { - 'LookupCount': sum, - 'Lookup': sumLists, -} - -otTables.Coverage.mergeMap = { - 'Format': min, - 'glyphs': sumLists, -} - -otTables.ClassDef.mergeMap = { - 'Format': min, - 'classDefs': sumDicts, -} - -otTables.LigCaretList.mergeMap = { - 'Coverage': mergeObjects, - 'LigGlyphCount': sum, - 'LigGlyph': sumLists, -} - -otTables.AttachList.mergeMap = { - 'Coverage': mergeObjects, - 'GlyphCount': sum, - 'AttachPoint': sumLists, -} - -# XXX Renumber MarkFilterSets of lookups -otTables.MarkGlyphSetsDef.mergeMap = { - 'MarkSetTableFormat': equal, - 'MarkSetCount': sum, - 'Coverage': sumLists, -} - -otTables.Axis.mergeMap = { - '*': mergeObjects, -} - -# XXX Fix BASE table merging -otTables.BaseTagList.mergeMap = { - 'BaseTagCount': sum, - 'BaselineTag': sumLists, -} - -otTables.GDEF.mergeMap = \ -otTables.GSUB.mergeMap = \ -otTables.GPOS.mergeMap = \ -otTables.BASE.mergeMap = \ -otTables.JSTF.mergeMap = \ -otTables.MATH.mergeMap = \ -{ - '*': mergeObjects, - 'Version': max, -} - -ttLib.getTableClass('GDEF').mergeMap = \ -ttLib.getTableClass('GSUB').mergeMap = \ -ttLib.getTableClass('GPOS').mergeMap = \ -ttLib.getTableClass('BASE').mergeMap = \ -ttLib.getTableClass('JSTF').mergeMap = \ -ttLib.getTableClass('MATH').mergeMap = \ -{ - 'tableTag': onlyExisting(equal), # XXX clean me up - 'table': mergeObjects, -} - -@_add_method(ttLib.getTableClass('GSUB')) -def merge(self, m, tables): - - assert len(tables) == len(m.duplicateGlyphsPerFont) - for i,(table,dups) in enumerate(zip(tables, m.duplicateGlyphsPerFont)): - if not dups: continue - assert (table is not None and table is not NotImplemented), "Have duplicates to resolve for font %d but no GSUB: %s" % (i + 1, dups) - synthFeature = None - synthLookup = None - for script in table.table.ScriptList.ScriptRecord: - if script.ScriptTag == 'DFLT': continue # XXX - for langsys in [script.Script.DefaultLangSys] + [l.LangSys for l in script.Script.LangSysRecord]: - if langsys is None: continue # XXX Create! - feature = [v for v in langsys.FeatureIndex if v.FeatureTag == 'locl'] - assert len(feature) <= 1 - if feature: - feature = feature[0] - else: - if not synthFeature: - synthFeature = otTables.FeatureRecord() - synthFeature.FeatureTag = 'locl' - f = synthFeature.Feature = otTables.Feature() - f.FeatureParams = None - f.LookupCount = 0 - f.LookupListIndex = [] - langsys.FeatureIndex.append(synthFeature) - langsys.FeatureIndex.sort(key=lambda v: v.FeatureTag) - table.table.FeatureList.FeatureRecord.append(synthFeature) - table.table.FeatureList.FeatureCount += 1 - feature = synthFeature - - if not synthLookup: - subtable = otTables.SingleSubst() - subtable.mapping = dups - synthLookup = otTables.Lookup() - synthLookup.LookupFlag = 0 - synthLookup.LookupType = 1 - synthLookup.SubTableCount = 1 - synthLookup.SubTable = [subtable] - if table.table.LookupList is None: - # mtiLib uses None as default value for LookupList, - # while feaLib points to an empty array with count 0 - # TODO: make them do the same - table.table.LookupList = otTables.LookupList() - table.table.LookupList.Lookup = [] - table.table.LookupList.LookupCount = 0 - table.table.LookupList.Lookup.append(synthLookup) - table.table.LookupList.LookupCount += 1 - - feature.Feature.LookupListIndex[:0] = [synthLookup] - feature.Feature.LookupCount += 1 - - DefaultTable.merge(self, m, tables) - return self - -@_add_method(otTables.SingleSubst, - otTables.MultipleSubst, - otTables.AlternateSubst, - otTables.LigatureSubst, - otTables.ReverseChainSingleSubst, - otTables.SinglePos, - otTables.PairPos, - otTables.CursivePos, - otTables.MarkBasePos, - otTables.MarkLigPos, - otTables.MarkMarkPos) -def mapLookups(self, lookupMap): - pass - -# Copied and trimmed down from subset.py -@_add_method(otTables.ContextSubst, - otTables.ChainContextSubst, - otTables.ContextPos, - otTables.ChainContextPos) -def __merge_classify_context(self): - - class ContextHelper(object): - def __init__(self, klass, Format): - if klass.__name__.endswith('Subst'): - Typ = 'Sub' - Type = 'Subst' - else: - Typ = 'Pos' - Type = 'Pos' - if klass.__name__.startswith('Chain'): - Chain = 'Chain' - else: - Chain = '' - ChainTyp = Chain+Typ - - self.Typ = Typ - self.Type = Type - self.Chain = Chain - self.ChainTyp = ChainTyp - - self.LookupRecord = Type+'LookupRecord' - - if Format == 1: - self.Rule = ChainTyp+'Rule' - self.RuleSet = ChainTyp+'RuleSet' - elif Format == 2: - self.Rule = ChainTyp+'ClassRule' - self.RuleSet = ChainTyp+'ClassSet' - - if self.Format not in [1, 2, 3]: - return None # Don't shoot the messenger; let it go - if not hasattr(self.__class__, "_merge__ContextHelpers"): - self.__class__._merge__ContextHelpers = {} - if self.Format not in self.__class__._merge__ContextHelpers: - helper = ContextHelper(self.__class__, self.Format) - self.__class__._merge__ContextHelpers[self.Format] = helper - return self.__class__._merge__ContextHelpers[self.Format] - - -@_add_method(otTables.ContextSubst, - otTables.ChainContextSubst, - otTables.ContextPos, - otTables.ChainContextPos) -def mapLookups(self, lookupMap): - c = self.__merge_classify_context() - - if self.Format in [1, 2]: - for rs in getattr(self, c.RuleSet): - if not rs: continue - for r in getattr(rs, c.Rule): - if not r: continue - for ll in getattr(r, c.LookupRecord): - if not ll: continue - ll.LookupListIndex = lookupMap[ll.LookupListIndex] - elif self.Format == 3: - for ll in getattr(self, c.LookupRecord): - if not ll: continue - ll.LookupListIndex = lookupMap[ll.LookupListIndex] - else: - assert 0, "unknown format: %s" % self.Format - -@_add_method(otTables.ExtensionSubst, - otTables.ExtensionPos) -def mapLookups(self, lookupMap): - if self.Format == 1: - self.ExtSubTable.mapLookups(lookupMap) - else: - assert 0, "unknown format: %s" % self.Format - -@_add_method(otTables.Lookup) -def mapLookups(self, lookupMap): - for st in self.SubTable: - if not st: continue - st.mapLookups(lookupMap) - -@_add_method(otTables.LookupList) -def mapLookups(self, lookupMap): - for l in self.Lookup: - if not l: continue - l.mapLookups(lookupMap) - -@_add_method(otTables.Feature) -def mapLookups(self, lookupMap): - self.LookupListIndex = [lookupMap[i] for i in self.LookupListIndex] - -@_add_method(otTables.FeatureList) -def mapLookups(self, lookupMap): - for f in self.FeatureRecord: - if not f or not f.Feature: continue - f.Feature.mapLookups(lookupMap) - -@_add_method(otTables.DefaultLangSys, - otTables.LangSys) -def mapFeatures(self, featureMap): - self.FeatureIndex = [featureMap[i] for i in self.FeatureIndex] - if self.ReqFeatureIndex != 65535: - self.ReqFeatureIndex = featureMap[self.ReqFeatureIndex] - -@_add_method(otTables.Script) -def mapFeatures(self, featureMap): - if self.DefaultLangSys: - self.DefaultLangSys.mapFeatures(featureMap) - for l in self.LangSysRecord: - if not l or not l.LangSys: continue - l.LangSys.mapFeatures(featureMap) - -@_add_method(otTables.ScriptList) -def mapFeatures(self, featureMap): - for s in self.ScriptRecord: - if not s or not s.Script: continue - s.Script.mapFeatures(featureMap) - - -class Options(object): - - class UnknownOptionError(Exception): - pass - - def __init__(self, **kwargs): - - self.verbose = False - self.timing = False - - self.set(**kwargs) - - def set(self, **kwargs): - for k,v in kwargs.items(): - if not hasattr(self, k): - raise self.UnknownOptionError("Unknown option '%s'" % k) - setattr(self, k, v) - - def parse_opts(self, argv, ignore_unknown=[]): - ret = [] - opts = {} - for a in argv: - orig_a = a - if not a.startswith('--'): - ret.append(a) - continue - a = a[2:] - i = a.find('=') - op = '=' - if i == -1: - if a.startswith("no-"): - k = a[3:] - v = False - else: - k = a - v = True - else: - k = a[:i] - if k[-1] in "-+": - op = k[-1]+'=' # Ops is '-=' or '+=' now. - k = k[:-1] - v = a[i+1:] - k = k.replace('-', '_') - if not hasattr(self, k): - if ignore_unknown is True or k in ignore_unknown: - ret.append(orig_a) - continue - else: - raise self.UnknownOptionError("Unknown option '%s'" % a) - - ov = getattr(self, k) - if isinstance(ov, bool): - v = bool(v) - elif isinstance(ov, int): - v = int(v) - elif isinstance(ov, list): - vv = v.split(',') - if vv == ['']: - vv = [] - vv = [int(x, 0) if len(x) and x[0] in "0123456789" else x for x in vv] - if op == '=': - v = vv - elif op == '+=': - v = ov - v.extend(vv) - elif op == '-=': - v = ov - for x in vv: - if x in v: - v.remove(x) - else: - assert 0 - - opts[k] = v - self.set(**opts) - - return ret - -class _AttendanceRecordingIdentityDict(object): - """A dictionary-like object that records indices of items actually accessed - from a list.""" - - def __init__(self, lst): - self.l = lst - self.d = {id(v):i for i,v in enumerate(lst)} - self.s = set() - - def __getitem__(self, v): - self.s.add(self.d[id(v)]) - return v - -class _GregariousIdentityDict(object): - """A dictionary-like object that welcomes guests without reservations and - adds them to the end of the guest list.""" - - def __init__(self, lst): - self.l = lst - self.s = set(id(v) for v in lst) - - def __getitem__(self, v): - if id(v) not in self.s: - self.s.add(id(v)) - self.l.append(v) - return v - -class _NonhashableDict(object): - """A dictionary-like object mapping objects to values.""" - - def __init__(self, keys, values=None): - if values is None: - self.d = {id(v):i for i,v in enumerate(keys)} - else: - self.d = {id(k):v for k,v in zip(keys, values)} - - def __getitem__(self, k): - return self.d[id(k)] - - def __setitem__(self, k, v): - self.d[id(k)] = v - - def __delitem__(self, k): - del self.d[id(k)] - -class Merger(object): - """Font merger. - - This class merges multiple files into a single OpenType font, taking into - account complexities such as OpenType layout (``GSUB``/``GPOS``) tables and - cross-font metrics (e.g. ``hhea.ascent`` is set to the maximum value across - all the fonts). - - If multiple glyphs map to the same Unicode value, and the glyphs are considered - sufficiently different (that is, they differ in any of paths, widths, or - height), then subsequent glyphs are renamed and a lookup in the ``locl`` - feature will be created to disambiguate them. For example, if the arguments - are an Arabic font and a Latin font and both contain a set of parentheses, - the Latin glyphs will be renamed to ``parenleft#1`` and ``parenright#1``, - and a lookup will be inserted into the to ``locl`` feature (creating it if - necessary) under the ``latn`` script to substitute ``parenleft`` with - ``parenleft#1`` etc. - - Restrictions: - - - All fonts must currently have TrueType outlines (``glyf`` table). - Merging fonts with CFF outlines is not supported. - - All fonts must have the same units per em. - - If duplicate glyph disambiguation takes place as described above then the - fonts must have a ``GSUB`` table. - - Attributes: - options: Currently unused. - """ - - def __init__(self, options=None): - - if not options: - options = Options() - - self.options = options - - def merge(self, fontfiles): - """Merges fonts together. - - Args: - fontfiles: A list of file names to be merged - - Returns: - A :class:`fontTools.ttLib.TTFont` object. Call the ``save`` method on - this to write it out to an OTF file. - """ - mega = ttLib.TTFont() - - # - # Settle on a mega glyph order. - # - fonts = [ttLib.TTFont(fontfile) for fontfile in fontfiles] - glyphOrders = [font.getGlyphOrder() for font in fonts] - megaGlyphOrder = self._mergeGlyphOrders(glyphOrders) - # Reload fonts and set new glyph names on them. - # TODO Is it necessary to reload font? I think it is. At least - # it's safer, in case tables were loaded to provide glyph names. - fonts = [ttLib.TTFont(fontfile) for fontfile in fontfiles] - for font,glyphOrder in zip(fonts, glyphOrders): - font.setGlyphOrder(glyphOrder) - mega.setGlyphOrder(megaGlyphOrder) - - for font in fonts: - self._preMerge(font) - - self.fonts = fonts - self.duplicateGlyphsPerFont = [{} for _ in fonts] - - allTags = reduce(set.union, (list(font.keys()) for font in fonts), set()) - allTags.remove('GlyphOrder') - - # Make sure we process cmap before GSUB as we have a dependency there. - if 'GSUB' in allTags: - allTags.remove('GSUB') - allTags = ['GSUB'] + list(allTags) - if 'cmap' in allTags: - allTags.remove('cmap') - allTags = ['cmap'] + list(allTags) - - for tag in allTags: - with timer("merge '%s'" % tag): - tables = [font.get(tag, NotImplemented) for font in fonts] - - log.info("Merging '%s'.", tag) - clazz = ttLib.getTableClass(tag) - table = clazz(tag).merge(self, tables) - # XXX Clean this up and use: table = mergeObjects(tables) - - if table is not NotImplemented and table is not False: - mega[tag] = table - log.info("Merged '%s'.", tag) - else: - log.info("Dropped '%s'.", tag) - - del self.duplicateGlyphsPerFont - del self.fonts - - self._postMerge(mega) - - return mega - - def _mergeGlyphOrders(self, glyphOrders): - """Modifies passed-in glyphOrders to reflect new glyph names. - Returns glyphOrder for the merged font.""" - mega = {} - for glyphOrder in glyphOrders: - for i,glyphName in enumerate(glyphOrder): - if glyphName in mega: - n = mega[glyphName] - while (glyphName + "#" + repr(n)) in mega: - n += 1 - mega[glyphName] = n - glyphName += "#" + repr(n) - glyphOrder[i] = glyphName - mega[glyphName] = 1 - return list(mega.keys()) - - def mergeObjects(self, returnTable, logic, tables): - # Right now we don't use self at all. Will use in the future - # for options and logging. - - allKeys = set.union(set(), *(vars(table).keys() for table in tables if table is not NotImplemented)) - for key in allKeys: - try: - mergeLogic = logic[key] - except KeyError: - try: - mergeLogic = logic['*'] - except KeyError: - raise Exception("Don't know how to merge key %s of class %s" % - (key, returnTable.__class__.__name__)) - if mergeLogic is NotImplemented: - continue - value = mergeLogic(getattr(table, key, NotImplemented) for table in tables) - if value is not NotImplemented: - setattr(returnTable, key, value) - - return returnTable - - def _preMerge(self, font): - - # Map indices to references - - GDEF = font.get('GDEF') - GSUB = font.get('GSUB') - GPOS = font.get('GPOS') - - for t in [GSUB, GPOS]: - if not t: continue - - if t.table.LookupList: - lookupMap = {i:v for i,v in enumerate(t.table.LookupList.Lookup)} - t.table.LookupList.mapLookups(lookupMap) - t.table.FeatureList.mapLookups(lookupMap) - - if t.table.FeatureList and t.table.ScriptList: - featureMap = {i:v for i,v in enumerate(t.table.FeatureList.FeatureRecord)} - t.table.ScriptList.mapFeatures(featureMap) - - # TODO GDEF/Lookup MarkFilteringSets - # TODO FeatureParams nameIDs - - def _postMerge(self, font): - - # Map references back to indices - - GDEF = font.get('GDEF') - GSUB = font.get('GSUB') - GPOS = font.get('GPOS') - - for t in [GSUB, GPOS]: - if not t: continue - - if t.table.FeatureList and t.table.ScriptList: - - # Collect unregistered (new) features. - featureMap = _GregariousIdentityDict(t.table.FeatureList.FeatureRecord) - t.table.ScriptList.mapFeatures(featureMap) - - # Record used features. - featureMap = _AttendanceRecordingIdentityDict(t.table.FeatureList.FeatureRecord) - t.table.ScriptList.mapFeatures(featureMap) - usedIndices = featureMap.s - - # Remove unused features - t.table.FeatureList.FeatureRecord = [f for i,f in enumerate(t.table.FeatureList.FeatureRecord) if i in usedIndices] - - # Map back to indices. - featureMap = _NonhashableDict(t.table.FeatureList.FeatureRecord) - t.table.ScriptList.mapFeatures(featureMap) - - t.table.FeatureList.FeatureCount = len(t.table.FeatureList.FeatureRecord) - - if t.table.LookupList: - - # Collect unregistered (new) lookups. - lookupMap = _GregariousIdentityDict(t.table.LookupList.Lookup) - t.table.FeatureList.mapLookups(lookupMap) - t.table.LookupList.mapLookups(lookupMap) - - # Record used lookups. - lookupMap = _AttendanceRecordingIdentityDict(t.table.LookupList.Lookup) - t.table.FeatureList.mapLookups(lookupMap) - t.table.LookupList.mapLookups(lookupMap) - usedIndices = lookupMap.s - - # Remove unused lookups - t.table.LookupList.Lookup = [l for i,l in enumerate(t.table.LookupList.Lookup) if i in usedIndices] - - # Map back to indices. - lookupMap = _NonhashableDict(t.table.LookupList.Lookup) - t.table.FeatureList.mapLookups(lookupMap) - t.table.LookupList.mapLookups(lookupMap) - - t.table.LookupList.LookupCount = len(t.table.LookupList.Lookup) - - # TODO GDEF/Lookup MarkFilteringSets - # TODO FeatureParams nameIDs - - -__all__ = [ - 'Options', - 'Merger', - 'main' -] - -@timer("make one with everything (TOTAL TIME)") -def main(args=None): - """Merge multiple fonts into one""" - from fontTools import configLogger - - if args is None: - args = sys.argv[1:] - - options = Options() - args = options.parse_opts(args) - - if len(args) < 1: - print("usage: pyftmerge font...", file=sys.stderr) - return 1 - - configLogger(level=logging.INFO if options.verbose else logging.WARNING) - if options.timing: - timer.logger.setLevel(logging.DEBUG) - else: - timer.logger.disabled = True - - merger = Merger(options=options) - font = merger.merge(args) - outfile = 'merged.ttf' - with timer("compile and save font"): - font.save(outfile) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/Lib/fontTools/merge/__init__.py b/Lib/fontTools/merge/__init__.py new file mode 100644 index 00000000..152bf079 --- /dev/null +++ b/Lib/fontTools/merge/__init__.py @@ -0,0 +1,200 @@ +# Copyright 2013 Google, Inc. All Rights Reserved. +# +# Google Author(s): Behdad Esfahbod, Roozbeh Pournader + +from fontTools import ttLib +import fontTools.merge.base +from fontTools.merge.cmap import computeMegaGlyphOrder, computeMegaCmap, renameCFFCharStrings +from fontTools.merge.layout import layoutPreMerge, layoutPostMerge +from fontTools.merge.options import Options +import fontTools.merge.tables +from fontTools.misc.loggingTools import Timer +from functools import reduce +import sys +import logging + + +log = logging.getLogger("fontTools.merge") +timer = Timer(logger=logging.getLogger(__name__+".timer"), level=logging.INFO) + + +class Merger(object): + """Font merger. + + This class merges multiple files into a single OpenType font, taking into + account complexities such as OpenType layout (``GSUB``/``GPOS``) tables and + cross-font metrics (e.g. ``hhea.ascent`` is set to the maximum value across + all the fonts). + + If multiple glyphs map to the same Unicode value, and the glyphs are considered + sufficiently different (that is, they differ in any of paths, widths, or + height), then subsequent glyphs are renamed and a lookup in the ``locl`` + feature will be created to disambiguate them. For example, if the arguments + are an Arabic font and a Latin font and both contain a set of parentheses, + the Latin glyphs will be renamed to ``parenleft#1`` and ``parenright#1``, + and a lookup will be inserted into the to ``locl`` feature (creating it if + necessary) under the ``latn`` script to substitute ``parenleft`` with + ``parenleft#1`` etc. + + Restrictions: + + - All fonts must have the same units per em. + - If duplicate glyph disambiguation takes place as described above then the + fonts must have a ``GSUB`` table. + + Attributes: + options: Currently unused. + """ + + def __init__(self, options=None): + + if not options: + options = Options() + + self.options = options + + def _openFonts(self, fontfiles): + fonts = [ttLib.TTFont(fontfile) for fontfile in fontfiles] + for font,fontfile in zip(fonts, fontfiles): + font._merger__fontfile = fontfile + font._merger__name = font['name'].getDebugName(4) + return fonts + + def merge(self, fontfiles): + """Merges fonts together. + + Args: + fontfiles: A list of file names to be merged + + Returns: + A :class:`fontTools.ttLib.TTFont` object. Call the ``save`` method on + this to write it out to an OTF file. + """ + # + # Settle on a mega glyph order. + # + fonts = self._openFonts(fontfiles) + glyphOrders = [list(font.getGlyphOrder()) for font in fonts] + computeMegaGlyphOrder(self, glyphOrders) + + # Take first input file sfntVersion + sfntVersion = fonts[0].sfntVersion + + # Reload fonts and set new glyph names on them. + fonts = self._openFonts(fontfiles) + for font,glyphOrder in zip(fonts, glyphOrders): + font.setGlyphOrder(glyphOrder) + if 'CFF ' in font: + renameCFFCharStrings(self, glyphOrder, font['CFF ']) + + cmaps = [font['cmap'] for font in fonts] + self.duplicateGlyphsPerFont = [{} for _ in fonts] + computeMegaCmap(self, cmaps) + + mega = ttLib.TTFont(sfntVersion=sfntVersion) + mega.setGlyphOrder(self.glyphOrder) + + for font in fonts: + self._preMerge(font) + + self.fonts = fonts + + allTags = reduce(set.union, (list(font.keys()) for font in fonts), set()) + allTags.remove('GlyphOrder') + + for tag in allTags: + if tag in self.options.drop_tables: + continue + + with timer("merge '%s'" % tag): + tables = [font.get(tag, NotImplemented) for font in fonts] + + log.info("Merging '%s'.", tag) + clazz = ttLib.getTableClass(tag) + table = clazz(tag).merge(self, tables) + # XXX Clean this up and use: table = mergeObjects(tables) + + if table is not NotImplemented and table is not False: + mega[tag] = table + log.info("Merged '%s'.", tag) + else: + log.info("Dropped '%s'.", tag) + + del self.duplicateGlyphsPerFont + del self.fonts + + self._postMerge(mega) + + return mega + + def mergeObjects(self, returnTable, logic, tables): + # Right now we don't use self at all. Will use in the future + # for options and logging. + + allKeys = set.union(set(), *(vars(table).keys() for table in tables if table is not NotImplemented)) + for key in allKeys: + try: + mergeLogic = logic[key] + except KeyError: + try: + mergeLogic = logic['*'] + except KeyError: + raise Exception("Don't know how to merge key %s of class %s" % + (key, returnTable.__class__.__name__)) + if mergeLogic is NotImplemented: + continue + value = mergeLogic(getattr(table, key, NotImplemented) for table in tables) + if value is not NotImplemented: + setattr(returnTable, key, value) + + return returnTable + + def _preMerge(self, font): + layoutPreMerge(font) + + def _postMerge(self, font): + layoutPostMerge(font) + + +__all__ = [ + 'Options', + 'Merger', + 'main' +] + +@timer("make one with everything (TOTAL TIME)") +def main(args=None): + """Merge multiple fonts into one""" + from fontTools import configLogger + + if args is None: + args = sys.argv[1:] + + options = Options() + args = options.parse_opts(args, ignore_unknown=['output-file']) + outfile = 'merged.ttf' + fontfiles = [] + for g in args: + if g.startswith('--output-file='): + outfile = g[14:] + continue + fontfiles.append(g) + + if len(args) < 1: + print("usage: pyftmerge font...", file=sys.stderr) + return 1 + + configLogger(level=logging.INFO if options.verbose else logging.WARNING) + if options.timing: + timer.logger.setLevel(logging.DEBUG) + else: + timer.logger.disabled = True + + merger = Merger(options=options) + font = merger.merge(fontfiles) + with timer("compile and save font"): + font.save(outfile) + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/Lib/fontTools/merge/__main__.py b/Lib/fontTools/merge/__main__.py new file mode 100644 index 00000000..623ca7d2 --- /dev/null +++ b/Lib/fontTools/merge/__main__.py @@ -0,0 +1,6 @@ +import sys +from fontTools.merge import main + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/Lib/fontTools/merge/base.py b/Lib/fontTools/merge/base.py new file mode 100644 index 00000000..868b51a4 --- /dev/null +++ b/Lib/fontTools/merge/base.py @@ -0,0 +1,76 @@ +# Copyright 2013 Google, Inc. All Rights Reserved. +# +# Google Author(s): Behdad Esfahbod, Roozbeh Pournader + +from fontTools.ttLib.tables.DefaultTable import DefaultTable +import logging + + +log = logging.getLogger("fontTools.merge") + + +def add_method(*clazzes, **kwargs): + """Returns a decorator function that adds a new method to one or + more classes.""" + allowDefault = kwargs.get('allowDefaultTable', False) + def wrapper(method): + done = [] + for clazz in clazzes: + if clazz in done: continue # Support multiple names of a clazz + done.append(clazz) + assert allowDefault or clazz != DefaultTable, 'Oops, table class not found.' + assert method.__name__ not in clazz.__dict__, \ + "Oops, class '%s' has method '%s'." % (clazz.__name__, method.__name__) + setattr(clazz, method.__name__, method) + return None + return wrapper + +def mergeObjects(lst): + lst = [item for item in lst if item is not NotImplemented] + if not lst: + return NotImplemented + lst = [item for item in lst if item is not None] + if not lst: + return None + + clazz = lst[0].__class__ + assert all(type(item) == clazz for item in lst), lst + + logic = clazz.mergeMap + returnTable = clazz() + returnDict = {} + + allKeys = set.union(set(), *(vars(table).keys() for table in lst)) + for key in allKeys: + try: + mergeLogic = logic[key] + except KeyError: + try: + mergeLogic = logic['*'] + except KeyError: + raise Exception("Don't know how to merge key %s of class %s" % + (key, clazz.__name__)) + if mergeLogic is NotImplemented: + continue + value = mergeLogic(getattr(table, key, NotImplemented) for table in lst) + if value is not NotImplemented: + returnDict[key] = value + + returnTable.__dict__ = returnDict + + return returnTable + +@add_method(DefaultTable, allowDefaultTable=True) +def merge(self, m, tables): + if not hasattr(self, 'mergeMap'): + log.info("Don't know how to merge '%s'.", self.tableTag) + return NotImplemented + + logic = self.mergeMap + + if isinstance(logic, dict): + return m.mergeObjects(self, self.mergeMap, tables) + else: + return logic(tables) + + diff --git a/Lib/fontTools/merge/cmap.py b/Lib/fontTools/merge/cmap.py new file mode 100644 index 00000000..7ade4ac9 --- /dev/null +++ b/Lib/fontTools/merge/cmap.py @@ -0,0 +1,129 @@ +# Copyright 2013 Google, Inc. All Rights Reserved. +# +# Google Author(s): Behdad Esfahbod, Roozbeh Pournader + +from fontTools.merge.unicode import is_Default_Ignorable +from fontTools.pens.recordingPen import DecomposingRecordingPen +import logging + + +log = logging.getLogger("fontTools.merge") + + +def computeMegaGlyphOrder(merger, glyphOrders): + """Modifies passed-in glyphOrders to reflect new glyph names. + Stores merger.glyphOrder.""" + megaOrder = {} + for glyphOrder in glyphOrders: + for i,glyphName in enumerate(glyphOrder): + if glyphName in megaOrder: + n = megaOrder[glyphName] + while (glyphName + "#" + repr(n)) in megaOrder: + n += 1 + megaOrder[glyphName] = n + glyphName += "#" + repr(n) + glyphOrder[i] = glyphName + megaOrder[glyphName] = 1 + merger.glyphOrder = megaOrder = list(megaOrder.keys()) + + +def _glyphsAreSame(glyphSet1, glyphSet2, glyph1, glyph2, + advanceTolerance=.05, + advanceToleranceEmpty=.20): + pen1 = DecomposingRecordingPen(glyphSet1) + pen2 = DecomposingRecordingPen(glyphSet2) + g1 = glyphSet1[glyph1] + g2 = glyphSet2[glyph2] + g1.draw(pen1) + g2.draw(pen2) + if pen1.value != pen2.value: + return False + # Allow more width tolerance for glyphs with no ink + tolerance = advanceTolerance if pen1.value else advanceToleranceEmpty + # TODO Warn if advances not the same but within tolerance. + if abs(g1.width - g2.width) > g1.width * tolerance: + return False + if hasattr(g1, 'height') and g1.height is not None: + if abs(g1.height - g2.height) > g1.height * tolerance: + return False + return True + +# Valid (format, platformID, platEncID) triplets for cmap subtables containing +# Unicode BMP-only and Unicode Full Repertoire semantics. +# Cf. OpenType spec for "Platform specific encodings": +# https://docs.microsoft.com/en-us/typography/opentype/spec/name +class _CmapUnicodePlatEncodings: + BMP = {(4, 3, 1), (4, 0, 3), (4, 0, 4), (4, 0, 6)} + FullRepertoire = {(12, 3, 10), (12, 0, 4), (12, 0, 6)} + +def computeMegaCmap(merger, cmapTables): + """Sets merger.cmap and merger.glyphOrder.""" + + # TODO Handle format=14. + # Only merge format 4 and 12 Unicode subtables, ignores all other subtables + # If there is a format 12 table for a font, ignore the format 4 table of it + chosenCmapTables = [] + for fontIdx,table in enumerate(cmapTables): + format4 = None + format12 = None + for subtable in table.tables: + properties = (subtable.format, subtable.platformID, subtable.platEncID) + if properties in _CmapUnicodePlatEncodings.BMP: + format4 = subtable + elif properties in _CmapUnicodePlatEncodings.FullRepertoire: + format12 = subtable + else: + log.warning( + "Dropped cmap subtable from font '%s':\t" + "format %2s, platformID %2s, platEncID %2s", + fontIdx, subtable.format, subtable.platformID, subtable.platEncID + ) + if format12 is not None: + chosenCmapTables.append((format12, fontIdx)) + elif format4 is not None: + chosenCmapTables.append((format4, fontIdx)) + + # Build the unicode mapping + merger.cmap = cmap = {} + fontIndexForGlyph = {} + glyphSets = [None for f in merger.fonts] if hasattr(merger, 'fonts') else None + + for table,fontIdx in chosenCmapTables: + # handle duplicates + for uni,gid in table.cmap.items(): + oldgid = cmap.get(uni, None) + if oldgid is None: + cmap[uni] = gid + fontIndexForGlyph[gid] = fontIdx + elif is_Default_Ignorable(uni) or uni in (0x25CC,): # U+25CC DOTTED CIRCLE + continue + elif oldgid != gid: + # Char previously mapped to oldgid, now to gid. + # Record, to fix up in GSUB 'locl' later. + if merger.duplicateGlyphsPerFont[fontIdx].get(oldgid) is None: + if glyphSets is not None: + oldFontIdx = fontIndexForGlyph[oldgid] + for idx in (fontIdx, oldFontIdx): + if glyphSets[idx] is None: + glyphSets[idx] = merger.fonts[idx].getGlyphSet() + #if _glyphsAreSame(glyphSets[oldFontIdx], glyphSets[fontIdx], oldgid, gid): + # continue + merger.duplicateGlyphsPerFont[fontIdx][oldgid] = gid + elif merger.duplicateGlyphsPerFont[fontIdx][oldgid] != gid: + # Char previously mapped to oldgid but oldgid is already remapped to a different + # gid, because of another Unicode character. + # TODO: Try harder to do something about these. + log.warning("Dropped mapping from codepoint %#06X to glyphId '%s'", uni, gid) + + +def renameCFFCharStrings(merger, glyphOrder, cffTable): + """Rename topDictIndex charStrings based on glyphOrder.""" + td = cffTable.cff.topDictIndex[0] + + charStrings = {} + for i, v in enumerate(td.CharStrings.charStrings.values()): + glyphName = glyphOrder[i] + charStrings[glyphName] = v + td.CharStrings.charStrings = charStrings + + td.charset = list(glyphOrder) diff --git a/Lib/fontTools/merge/layout.py b/Lib/fontTools/merge/layout.py new file mode 100644 index 00000000..4bf01c37 --- /dev/null +++ b/Lib/fontTools/merge/layout.py @@ -0,0 +1,466 @@ +# Copyright 2013 Google, Inc. All Rights Reserved. +# +# Google Author(s): Behdad Esfahbod, Roozbeh Pournader + +from fontTools import ttLib +from fontTools.ttLib.tables.DefaultTable import DefaultTable +from fontTools.ttLib.tables import otTables +from fontTools.merge.base import add_method, mergeObjects +from fontTools.merge.util import * +import logging + + +log = logging.getLogger("fontTools.merge") + + +def mergeLookupLists(lst): + # TODO Do smarter merge. + return sumLists(lst) + +def mergeFeatures(lst): + assert lst + self = otTables.Feature() + self.FeatureParams = None + self.LookupListIndex = mergeLookupLists([l.LookupListIndex for l in lst if l.LookupListIndex]) + self.LookupCount = len(self.LookupListIndex) + return self + +def mergeFeatureLists(lst): + d = {} + for l in lst: + for f in l: + tag = f.FeatureTag + if tag not in d: + d[tag] = [] + d[tag].append(f.Feature) + ret = [] + for tag in sorted(d.keys()): + rec = otTables.FeatureRecord() + rec.FeatureTag = tag + rec.Feature = mergeFeatures(d[tag]) + ret.append(rec) + return ret + +def mergeLangSyses(lst): + assert lst + + # TODO Support merging ReqFeatureIndex + assert all(l.ReqFeatureIndex == 0xFFFF for l in lst) + + self = otTables.LangSys() + self.LookupOrder = None + self.ReqFeatureIndex = 0xFFFF + self.FeatureIndex = mergeFeatureLists([l.FeatureIndex for l in lst if l.FeatureIndex]) + self.FeatureCount = len(self.FeatureIndex) + return self + +def mergeScripts(lst): + assert lst + + if len(lst) == 1: + return lst[0] + langSyses = {} + for sr in lst: + for lsr in sr.LangSysRecord: + if lsr.LangSysTag not in langSyses: + langSyses[lsr.LangSysTag] = [] + langSyses[lsr.LangSysTag].append(lsr.LangSys) + lsrecords = [] + for tag, langSys_list in sorted(langSyses.items()): + lsr = otTables.LangSysRecord() + lsr.LangSys = mergeLangSyses(langSys_list) + lsr.LangSysTag = tag + lsrecords.append(lsr) + + self = otTables.Script() + self.LangSysRecord = lsrecords + self.LangSysCount = len(lsrecords) + dfltLangSyses = [s.DefaultLangSys for s in lst if s.DefaultLangSys] + if dfltLangSyses: + self.DefaultLangSys = mergeLangSyses(dfltLangSyses) + else: + self.DefaultLangSys = None + return self + +def mergeScriptRecords(lst): + d = {} + for l in lst: + for s in l: + tag = s.ScriptTag + if tag not in d: + d[tag] = [] + d[tag].append(s.Script) + ret = [] + for tag in sorted(d.keys()): + rec = otTables.ScriptRecord() + rec.ScriptTag = tag + rec.Script = mergeScripts(d[tag]) + ret.append(rec) + return ret + +otTables.ScriptList.mergeMap = { + 'ScriptCount': lambda lst: None, # TODO + 'ScriptRecord': mergeScriptRecords, +} +otTables.BaseScriptList.mergeMap = { + 'BaseScriptCount': lambda lst: None, # TODO + # TODO: Merge duplicate entries + 'BaseScriptRecord': lambda lst: sorted(sumLists(lst), key=lambda s: s.BaseScriptTag), +} + +otTables.FeatureList.mergeMap = { + 'FeatureCount': sum, + 'FeatureRecord': lambda lst: sorted(sumLists(lst), key=lambda s: s.FeatureTag), +} + +otTables.LookupList.mergeMap = { + 'LookupCount': sum, + 'Lookup': sumLists, +} + +otTables.Coverage.mergeMap = { + 'Format': min, + 'glyphs': sumLists, +} + +otTables.ClassDef.mergeMap = { + 'Format': min, + 'classDefs': sumDicts, +} + +otTables.LigCaretList.mergeMap = { + 'Coverage': mergeObjects, + 'LigGlyphCount': sum, + 'LigGlyph': sumLists, +} + +otTables.AttachList.mergeMap = { + 'Coverage': mergeObjects, + 'GlyphCount': sum, + 'AttachPoint': sumLists, +} + +# XXX Renumber MarkFilterSets of lookups +otTables.MarkGlyphSetsDef.mergeMap = { + 'MarkSetTableFormat': equal, + 'MarkSetCount': sum, + 'Coverage': sumLists, +} + +otTables.Axis.mergeMap = { + '*': mergeObjects, +} + +# XXX Fix BASE table merging +otTables.BaseTagList.mergeMap = { + 'BaseTagCount': sum, + 'BaselineTag': sumLists, +} + +otTables.GDEF.mergeMap = \ +otTables.GSUB.mergeMap = \ +otTables.GPOS.mergeMap = \ +otTables.BASE.mergeMap = \ +otTables.JSTF.mergeMap = \ +otTables.MATH.mergeMap = \ +{ + '*': mergeObjects, + 'Version': max, +} + +ttLib.getTableClass('GDEF').mergeMap = \ +ttLib.getTableClass('GSUB').mergeMap = \ +ttLib.getTableClass('GPOS').mergeMap = \ +ttLib.getTableClass('BASE').mergeMap = \ +ttLib.getTableClass('JSTF').mergeMap = \ +ttLib.getTableClass('MATH').mergeMap = \ +{ + 'tableTag': onlyExisting(equal), # XXX clean me up + 'table': mergeObjects, +} + +@add_method(ttLib.getTableClass('GSUB')) +def merge(self, m, tables): + + assert len(tables) == len(m.duplicateGlyphsPerFont) + for i,(table,dups) in enumerate(zip(tables, m.duplicateGlyphsPerFont)): + if not dups: continue + if table is None or table is NotImplemented: + log.warning("Have non-identical duplicates to resolve for '%s' but no GSUB. Are duplicates intended?: %s", m.fonts[i]._merger__name, dups) + continue + + synthFeature = None + synthLookup = None + for script in table.table.ScriptList.ScriptRecord: + if script.ScriptTag == 'DFLT': continue # XXX + for langsys in [script.Script.DefaultLangSys] + [l.LangSys for l in script.Script.LangSysRecord]: + if langsys is None: continue # XXX Create! + feature = [v for v in langsys.FeatureIndex if v.FeatureTag == 'locl'] + assert len(feature) <= 1 + if feature: + feature = feature[0] + else: + if not synthFeature: + synthFeature = otTables.FeatureRecord() + synthFeature.FeatureTag = 'locl' + f = synthFeature.Feature = otTables.Feature() + f.FeatureParams = None + f.LookupCount = 0 + f.LookupListIndex = [] + table.table.FeatureList.FeatureRecord.append(synthFeature) + table.table.FeatureList.FeatureCount += 1 + feature = synthFeature + langsys.FeatureIndex.append(feature) + langsys.FeatureIndex.sort(key=lambda v: v.FeatureTag) + + if not synthLookup: + subtable = otTables.SingleSubst() + subtable.mapping = dups + synthLookup = otTables.Lookup() + synthLookup.LookupFlag = 0 + synthLookup.LookupType = 1 + synthLookup.SubTableCount = 1 + synthLookup.SubTable = [subtable] + if table.table.LookupList is None: + # mtiLib uses None as default value for LookupList, + # while feaLib points to an empty array with count 0 + # TODO: make them do the same + table.table.LookupList = otTables.LookupList() + table.table.LookupList.Lookup = [] + table.table.LookupList.LookupCount = 0 + table.table.LookupList.Lookup.append(synthLookup) + table.table.LookupList.LookupCount += 1 + + if feature.Feature.LookupListIndex[:1] != [synthLookup]: + feature.Feature.LookupListIndex[:0] = [synthLookup] + feature.Feature.LookupCount += 1 + + DefaultTable.merge(self, m, tables) + return self + +@add_method(otTables.SingleSubst, + otTables.MultipleSubst, + otTables.AlternateSubst, + otTables.LigatureSubst, + otTables.ReverseChainSingleSubst, + otTables.SinglePos, + otTables.PairPos, + otTables.CursivePos, + otTables.MarkBasePos, + otTables.MarkLigPos, + otTables.MarkMarkPos) +def mapLookups(self, lookupMap): + pass + +# Copied and trimmed down from subset.py +@add_method(otTables.ContextSubst, + otTables.ChainContextSubst, + otTables.ContextPos, + otTables.ChainContextPos) +def __merge_classify_context(self): + + class ContextHelper(object): + def __init__(self, klass, Format): + if klass.__name__.endswith('Subst'): + Typ = 'Sub' + Type = 'Subst' + else: + Typ = 'Pos' + Type = 'Pos' + if klass.__name__.startswith('Chain'): + Chain = 'Chain' + else: + Chain = '' + ChainTyp = Chain+Typ + + self.Typ = Typ + self.Type = Type + self.Chain = Chain + self.ChainTyp = ChainTyp + + self.LookupRecord = Type+'LookupRecord' + + if Format == 1: + self.Rule = ChainTyp+'Rule' + self.RuleSet = ChainTyp+'RuleSet' + elif Format == 2: + self.Rule = ChainTyp+'ClassRule' + self.RuleSet = ChainTyp+'ClassSet' + + if self.Format not in [1, 2, 3]: + return None # Don't shoot the messenger; let it go + if not hasattr(self.__class__, "_merge__ContextHelpers"): + self.__class__._merge__ContextHelpers = {} + if self.Format not in self.__class__._merge__ContextHelpers: + helper = ContextHelper(self.__class__, self.Format) + self.__class__._merge__ContextHelpers[self.Format] = helper + return self.__class__._merge__ContextHelpers[self.Format] + + +@add_method(otTables.ContextSubst, + otTables.ChainContextSubst, + otTables.ContextPos, + otTables.ChainContextPos) +def mapLookups(self, lookupMap): + c = self.__merge_classify_context() + + if self.Format in [1, 2]: + for rs in getattr(self, c.RuleSet): + if not rs: continue + for r in getattr(rs, c.Rule): + if not r: continue + for ll in getattr(r, c.LookupRecord): + if not ll: continue + ll.LookupListIndex = lookupMap[ll.LookupListIndex] + elif self.Format == 3: + for ll in getattr(self, c.LookupRecord): + if not ll: continue + ll.LookupListIndex = lookupMap[ll.LookupListIndex] + else: + assert 0, "unknown format: %s" % self.Format + +@add_method(otTables.ExtensionSubst, + otTables.ExtensionPos) +def mapLookups(self, lookupMap): + if self.Format == 1: + self.ExtSubTable.mapLookups(lookupMap) + else: + assert 0, "unknown format: %s" % self.Format + +@add_method(otTables.Lookup) +def mapLookups(self, lookupMap): + for st in self.SubTable: + if not st: continue + st.mapLookups(lookupMap) + +@add_method(otTables.LookupList) +def mapLookups(self, lookupMap): + for l in self.Lookup: + if not l: continue + l.mapLookups(lookupMap) + +@add_method(otTables.Lookup) +def mapMarkFilteringSets(self, markFilteringSetMap): + if self.LookupFlag & 0x0010: + self.MarkFilteringSet = markFilteringSetMap[self.MarkFilteringSet] + +@add_method(otTables.LookupList) +def mapMarkFilteringSets(self, markFilteringSetMap): + for l in self.Lookup: + if not l: continue + l.mapMarkFilteringSets(markFilteringSetMap) + +@add_method(otTables.Feature) +def mapLookups(self, lookupMap): + self.LookupListIndex = [lookupMap[i] for i in self.LookupListIndex] + +@add_method(otTables.FeatureList) +def mapLookups(self, lookupMap): + for f in self.FeatureRecord: + if not f or not f.Feature: continue + f.Feature.mapLookups(lookupMap) + +@add_method(otTables.DefaultLangSys, + otTables.LangSys) +def mapFeatures(self, featureMap): + self.FeatureIndex = [featureMap[i] for i in self.FeatureIndex] + if self.ReqFeatureIndex != 65535: + self.ReqFeatureIndex = featureMap[self.ReqFeatureIndex] + +@add_method(otTables.Script) +def mapFeatures(self, featureMap): + if self.DefaultLangSys: + self.DefaultLangSys.mapFeatures(featureMap) + for l in self.LangSysRecord: + if not l or not l.LangSys: continue + l.LangSys.mapFeatures(featureMap) + +@add_method(otTables.ScriptList) +def mapFeatures(self, featureMap): + for s in self.ScriptRecord: + if not s or not s.Script: continue + s.Script.mapFeatures(featureMap) + +def layoutPreMerge(font): + # Map indices to references + + GDEF = font.get('GDEF') + GSUB = font.get('GSUB') + GPOS = font.get('GPOS') + + for t in [GSUB, GPOS]: + if not t: continue + + if t.table.LookupList: + lookupMap = {i:v for i,v in enumerate(t.table.LookupList.Lookup)} + t.table.LookupList.mapLookups(lookupMap) + t.table.FeatureList.mapLookups(lookupMap) + + if GDEF and GDEF.table.Version >= 0x00010002: + markFilteringSetMap = {i:v for i,v in enumerate(GDEF.table.MarkGlyphSetsDef.Coverage)} + t.table.LookupList.mapMarkFilteringSets(markFilteringSetMap) + + if t.table.FeatureList and t.table.ScriptList: + featureMap = {i:v for i,v in enumerate(t.table.FeatureList.FeatureRecord)} + t.table.ScriptList.mapFeatures(featureMap) + + # TODO FeatureParams nameIDs + +def layoutPostMerge(font): + # Map references back to indices + + GDEF = font.get('GDEF') + GSUB = font.get('GSUB') + GPOS = font.get('GPOS') + + for t in [GSUB, GPOS]: + if not t: continue + + if t.table.FeatureList and t.table.ScriptList: + + # Collect unregistered (new) features. + featureMap = GregariousIdentityDict(t.table.FeatureList.FeatureRecord) + t.table.ScriptList.mapFeatures(featureMap) + + # Record used features. + featureMap = AttendanceRecordingIdentityDict(t.table.FeatureList.FeatureRecord) + t.table.ScriptList.mapFeatures(featureMap) + usedIndices = featureMap.s + + # Remove unused features + t.table.FeatureList.FeatureRecord = [f for i,f in enumerate(t.table.FeatureList.FeatureRecord) if i in usedIndices] + + # Map back to indices. + featureMap = NonhashableDict(t.table.FeatureList.FeatureRecord) + t.table.ScriptList.mapFeatures(featureMap) + + t.table.FeatureList.FeatureCount = len(t.table.FeatureList.FeatureRecord) + + if t.table.LookupList: + + # Collect unregistered (new) lookups. + lookupMap = GregariousIdentityDict(t.table.LookupList.Lookup) + t.table.FeatureList.mapLookups(lookupMap) + t.table.LookupList.mapLookups(lookupMap) + + # Record used lookups. + lookupMap = AttendanceRecordingIdentityDict(t.table.LookupList.Lookup) + t.table.FeatureList.mapLookups(lookupMap) + t.table.LookupList.mapLookups(lookupMap) + usedIndices = lookupMap.s + + # Remove unused lookups + t.table.LookupList.Lookup = [l for i,l in enumerate(t.table.LookupList.Lookup) if i in usedIndices] + + # Map back to indices. + lookupMap = NonhashableDict(t.table.LookupList.Lookup) + t.table.FeatureList.mapLookups(lookupMap) + t.table.LookupList.mapLookups(lookupMap) + + t.table.LookupList.LookupCount = len(t.table.LookupList.Lookup) + + if GDEF and GDEF.table.Version >= 0x00010002: + markFilteringSetMap = NonhashableDict(GDEF.table.MarkGlyphSetsDef.Coverage) + t.table.LookupList.mapMarkFilteringSets(markFilteringSetMap) + + # TODO FeatureParams nameIDs diff --git a/Lib/fontTools/merge/options.py b/Lib/fontTools/merge/options.py new file mode 100644 index 00000000..02dcf4b7 --- /dev/null +++ b/Lib/fontTools/merge/options.py @@ -0,0 +1,85 @@ +# Copyright 2013 Google, Inc. All Rights Reserved. +# +# Google Author(s): Behdad Esfahbod, Roozbeh Pournader + + +class Options(object): + + class UnknownOptionError(Exception): + pass + + def __init__(self, **kwargs): + + self.verbose = False + self.timing = False + self.drop_tables = [] + + self.set(**kwargs) + + def set(self, **kwargs): + for k,v in kwargs.items(): + if not hasattr(self, k): + raise self.UnknownOptionError("Unknown option '%s'" % k) + setattr(self, k, v) + + def parse_opts(self, argv, ignore_unknown=[]): + ret = [] + opts = {} + for a in argv: + orig_a = a + if not a.startswith('--'): + ret.append(a) + continue + a = a[2:] + i = a.find('=') + op = '=' + if i == -1: + if a.startswith("no-"): + k = a[3:] + v = False + else: + k = a + v = True + else: + k = a[:i] + if k[-1] in "-+": + op = k[-1]+'=' # Ops is '-=' or '+=' now. + k = k[:-1] + v = a[i+1:] + ok = k + k = k.replace('-', '_') + if not hasattr(self, k): + if ignore_unknown is True or ok in ignore_unknown: + ret.append(orig_a) + continue + else: + raise self.UnknownOptionError("Unknown option '%s'" % a) + + ov = getattr(self, k) + if isinstance(ov, bool): + v = bool(v) + elif isinstance(ov, int): + v = int(v) + elif isinstance(ov, list): + vv = v.split(',') + if vv == ['']: + vv = [] + vv = [int(x, 0) if len(x) and x[0] in "0123456789" else x for x in vv] + if op == '=': + v = vv + elif op == '+=': + v = ov + v.extend(vv) + elif op == '-=': + v = ov + for x in vv: + if x in v: + v.remove(x) + else: + assert 0 + + opts[k] = v + self.set(**opts) + + return ret + diff --git a/Lib/fontTools/merge/tables.py b/Lib/fontTools/merge/tables.py new file mode 100644 index 00000000..b266f7a9 --- /dev/null +++ b/Lib/fontTools/merge/tables.py @@ -0,0 +1,311 @@ +# Copyright 2013 Google, Inc. All Rights Reserved. +# +# Google Author(s): Behdad Esfahbod, Roozbeh Pournader + +from fontTools import ttLib, cffLib +from fontTools.ttLib.tables.DefaultTable import DefaultTable +from fontTools.merge.base import add_method, mergeObjects +from fontTools.merge.cmap import computeMegaCmap +from fontTools.merge.util import * +import logging + + +log = logging.getLogger("fontTools.merge") + + +ttLib.getTableClass('maxp').mergeMap = { + '*': max, + 'tableTag': equal, + 'tableVersion': equal, + 'numGlyphs': sum, + 'maxStorage': first, + 'maxFunctionDefs': first, + 'maxInstructionDefs': first, + # TODO When we correctly merge hinting data, update these values: + # maxFunctionDefs, maxInstructionDefs, maxSizeOfInstructions +} + +headFlagsMergeBitMap = { + 'size': 16, + '*': bitwise_or, + 1: bitwise_and, # Baseline at y = 0 + 2: bitwise_and, # lsb at x = 0 + 3: bitwise_and, # Force ppem to integer values. FIXME? + 5: bitwise_and, # Font is vertical + 6: lambda bit: 0, # Always set to zero + 11: bitwise_and, # Font data is 'lossless' + 13: bitwise_and, # Optimized for ClearType + 14: bitwise_and, # Last resort font. FIXME? equal or first may be better + 15: lambda bit: 0, # Always set to zero +} + +ttLib.getTableClass('head').mergeMap = { + 'tableTag': equal, + 'tableVersion': max, + 'fontRevision': max, + 'checkSumAdjustment': lambda lst: 0, # We need *something* here + 'magicNumber': equal, + 'flags': mergeBits(headFlagsMergeBitMap), + 'unitsPerEm': equal, + 'created': current_time, + 'modified': current_time, + 'xMin': min, + 'yMin': min, + 'xMax': max, + 'yMax': max, + 'macStyle': first, + 'lowestRecPPEM': max, + 'fontDirectionHint': lambda lst: 2, + 'indexToLocFormat': first, + 'glyphDataFormat': equal, +} + +ttLib.getTableClass('hhea').mergeMap = { + '*': equal, + 'tableTag': equal, + 'tableVersion': max, + 'ascent': max, + 'descent': min, + 'lineGap': max, + 'advanceWidthMax': max, + 'minLeftSideBearing': min, + 'minRightSideBearing': min, + 'xMaxExtent': max, + 'caretSlopeRise': first, + 'caretSlopeRun': first, + 'caretOffset': first, + 'numberOfHMetrics': recalculate, +} + +ttLib.getTableClass('vhea').mergeMap = { + '*': equal, + 'tableTag': equal, + 'tableVersion': max, + 'ascent': max, + 'descent': min, + 'lineGap': max, + 'advanceHeightMax': max, + 'minTopSideBearing': min, + 'minBottomSideBearing': min, + 'yMaxExtent': max, + 'caretSlopeRise': first, + 'caretSlopeRun': first, + 'caretOffset': first, + 'numberOfVMetrics': recalculate, +} + +os2FsTypeMergeBitMap = { + 'size': 16, + '*': lambda bit: 0, + 1: bitwise_or, # no embedding permitted + 2: bitwise_and, # allow previewing and printing documents + 3: bitwise_and, # allow editing documents + 8: bitwise_or, # no subsetting permitted + 9: bitwise_or, # no embedding of outlines permitted +} + +def mergeOs2FsType(lst): + lst = list(lst) + if all(item == 0 for item in lst): + return 0 + + # Compute least restrictive logic for each fsType value + for i in range(len(lst)): + # unset bit 1 (no embedding permitted) if either bit 2 or 3 is set + if lst[i] & 0x000C: + lst[i] &= ~0x0002 + # set bit 2 (allow previewing) if bit 3 is set (allow editing) + elif lst[i] & 0x0008: + lst[i] |= 0x0004 + # set bits 2 and 3 if everything is allowed + elif lst[i] == 0: + lst[i] = 0x000C + + fsType = mergeBits(os2FsTypeMergeBitMap)(lst) + # unset bits 2 and 3 if bit 1 is set (some font is "no embedding") + if fsType & 0x0002: + fsType &= ~0x000C + return fsType + + +ttLib.getTableClass('OS/2').mergeMap = { + '*': first, + 'tableTag': equal, + 'version': max, + 'xAvgCharWidth': avg_int, # Apparently fontTools doesn't recalc this + 'fsType': mergeOs2FsType, # Will be overwritten + 'panose': first, # FIXME: should really be the first Latin font + 'ulUnicodeRange1': bitwise_or, + 'ulUnicodeRange2': bitwise_or, + 'ulUnicodeRange3': bitwise_or, + 'ulUnicodeRange4': bitwise_or, + 'fsFirstCharIndex': min, + 'fsLastCharIndex': max, + 'sTypoAscender': max, + 'sTypoDescender': min, + 'sTypoLineGap': max, + 'usWinAscent': max, + 'usWinDescent': max, + # Version 1 + 'ulCodePageRange1': onlyExisting(bitwise_or), + 'ulCodePageRange2': onlyExisting(bitwise_or), + # Version 2, 3, 4 + 'sxHeight': onlyExisting(max), + 'sCapHeight': onlyExisting(max), + 'usDefaultChar': onlyExisting(first), + 'usBreakChar': onlyExisting(first), + 'usMaxContext': onlyExisting(max), + # version 5 + 'usLowerOpticalPointSize': onlyExisting(min), + 'usUpperOpticalPointSize': onlyExisting(max), +} + +@add_method(ttLib.getTableClass('OS/2')) +def merge(self, m, tables): + DefaultTable.merge(self, m, tables) + if self.version < 2: + # bits 8 and 9 are reserved and should be set to zero + self.fsType &= ~0x0300 + if self.version >= 3: + # Only one of bits 1, 2, and 3 may be set. We already take + # care of bit 1 implications in mergeOs2FsType. So unset + # bit 2 if bit 3 is already set. + if self.fsType & 0x0008: + self.fsType &= ~0x0004 + return self + +ttLib.getTableClass('post').mergeMap = { + '*': first, + 'tableTag': equal, + 'formatType': max, + 'isFixedPitch': min, + 'minMemType42': max, + 'maxMemType42': lambda lst: 0, + 'minMemType1': max, + 'maxMemType1': lambda lst: 0, + 'mapping': onlyExisting(sumDicts), + 'extraNames': lambda lst: [], +} + +ttLib.getTableClass('vmtx').mergeMap = ttLib.getTableClass('hmtx').mergeMap = { + 'tableTag': equal, + 'metrics': sumDicts, +} + +ttLib.getTableClass('name').mergeMap = { + 'tableTag': equal, + 'names': first, # FIXME? Does mixing name records make sense? +} + +ttLib.getTableClass('loca').mergeMap = { + '*': recalculate, + 'tableTag': equal, +} + +ttLib.getTableClass('glyf').mergeMap = { + 'tableTag': equal, + 'glyphs': sumDicts, + 'glyphOrder': sumLists, +} + +@add_method(ttLib.getTableClass('glyf')) +def merge(self, m, tables): + for i,table in enumerate(tables): + for g in table.glyphs.values(): + if i: + # Drop hints for all but first font, since + # we don't map functions / CVT values. + g.removeHinting() + # Expand composite glyphs to load their + # composite glyph names. + if g.isComposite(): + g.expand(table) + return DefaultTable.merge(self, m, tables) + +ttLib.getTableClass('prep').mergeMap = lambda self, lst: first(lst) +ttLib.getTableClass('fpgm').mergeMap = lambda self, lst: first(lst) +ttLib.getTableClass('cvt ').mergeMap = lambda self, lst: first(lst) +ttLib.getTableClass('gasp').mergeMap = lambda self, lst: first(lst) # FIXME? Appears irreconcilable + +@add_method(ttLib.getTableClass('CFF ')) +def merge(self, m, tables): + + if any(hasattr(table, "FDSelect") for table in tables): + raise NotImplementedError( + "Merging CID-keyed CFF tables is not supported yet" + ) + + for table in tables: + table.cff.desubroutinize() + + newcff = tables[0] + newfont = newcff.cff[0] + private = newfont.Private + storedNamesStrings = [] + glyphOrderStrings = [] + glyphOrder = set(newfont.getGlyphOrder()) + + for name in newfont.strings.strings: + if name not in glyphOrder: + storedNamesStrings.append(name) + else: + glyphOrderStrings.append(name) + + chrset = list(newfont.charset) + newcs = newfont.CharStrings + log.debug("FONT 0 CharStrings: %d.", len(newcs)) + + for i, table in enumerate(tables[1:], start=1): + font = table.cff[0] + font.Private = private + fontGlyphOrder = set(font.getGlyphOrder()) + for name in font.strings.strings: + if name in fontGlyphOrder: + glyphOrderStrings.append(name) + cs = font.CharStrings + gs = table.cff.GlobalSubrs + log.debug("Font %d CharStrings: %d.", i, len(cs)) + chrset.extend(font.charset) + if newcs.charStringsAreIndexed: + for i, name in enumerate(cs.charStrings, start=len(newcs)): + newcs.charStrings[name] = i + newcs.charStringsIndex.items.append(None) + for name in cs.charStrings: + newcs[name] = cs[name] + + newfont.charset = chrset + newfont.numGlyphs = len(chrset) + newfont.strings.strings = glyphOrderStrings + storedNamesStrings + + return newcff + +@add_method(ttLib.getTableClass('cmap')) +def merge(self, m, tables): + + # TODO Handle format=14. + if not hasattr(m, 'cmap'): + computeMegaCmap(m, tables) + cmap = m.cmap + + cmapBmpOnly = {uni: gid for uni,gid in cmap.items() if uni <= 0xFFFF} + self.tables = [] + module = ttLib.getTableModule('cmap') + if len(cmapBmpOnly) != len(cmap): + # format-12 required. + cmapTable = module.cmap_classes[12](12) + cmapTable.platformID = 3 + cmapTable.platEncID = 10 + cmapTable.language = 0 + cmapTable.cmap = cmap + self.tables.append(cmapTable) + # always create format-4 + cmapTable = module.cmap_classes[4](4) + cmapTable.platformID = 3 + cmapTable.platEncID = 1 + cmapTable.language = 0 + cmapTable.cmap = cmapBmpOnly + # ordered by platform then encoding + self.tables.insert(0, cmapTable) + self.tableVersion = 0 + self.numSubTables = len(self.tables) + return self diff --git a/Lib/fontTools/merge/unicode.py b/Lib/fontTools/merge/unicode.py new file mode 100644 index 00000000..f91baee8 --- /dev/null +++ b/Lib/fontTools/merge/unicode.py @@ -0,0 +1,65 @@ +# Copyright 2021 Behdad Esfahbod. All Rights Reserved. + +def is_Default_Ignorable(u): + # http://www.unicode.org/reports/tr44/#Default_Ignorable_Code_Point + # + # TODO Move me to unicodedata module and autogenerate. + # + # Unicode 14.0: + # $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/' + # 00AD # Cf SOFT HYPHEN + # 034F # Mn COMBINING GRAPHEME JOINER + # 061C # Cf ARABIC LETTER MARK + # 115F..1160 # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER + # 17B4..17B5 # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + # 180B..180D # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + # 180E # Cf MONGOLIAN VOWEL SEPARATOR + # 180F # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR + # 200B..200F # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK + # 202A..202E # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + # 2060..2064 # Cf [5] WORD JOINER..INVISIBLE PLUS + # 2065 # Cn + # 2066..206F # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + # 3164 # Lo HANGUL FILLER + # FE00..FE0F # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + # FEFF # Cf ZERO WIDTH NO-BREAK SPACE + # FFA0 # Lo HALFWIDTH HANGUL FILLER + # FFF0..FFF8 # Cn [9] .. + # 1BCA0..1BCA3 # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + # 1D173..1D17A # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + # E0000 # Cn + # E0001 # Cf LANGUAGE TAG + # E0002..E001F # Cn [30] .. + # E0020..E007F # Cf [96] TAG SPACE..CANCEL TAG + # E0080..E00FF # Cn [128] .. + # E0100..E01EF # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + # E01F0..E0FFF # Cn [3600] .. + return ( + u == 0x00AD or # Cf SOFT HYPHEN + u == 0x034F or # Mn COMBINING GRAPHEME JOINER + u == 0x061C or # Cf ARABIC LETTER MARK + 0x115F <= u <= 0x1160 or # Lo [2] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG FILLER + 0x17B4 <= u <= 0x17B5 or # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + 0x180B <= u <= 0x180D or # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + u == 0x180E or # Cf MONGOLIAN VOWEL SEPARATOR + u == 0x180F or # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR + 0x200B <= u <= 0x200F or # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK + 0x202A <= u <= 0x202E or # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + 0x2060 <= u <= 0x2064 or # Cf [5] WORD JOINER..INVISIBLE PLUS + u == 0x2065 or # Cn + 0x2066 <= u <= 0x206F or # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + u == 0x3164 or # Lo HANGUL FILLER + 0xFE00 <= u <= 0xFE0F or # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + u == 0xFEFF or # Cf ZERO WIDTH NO-BREAK SPACE + u == 0xFFA0 or # Lo HALFWIDTH HANGUL FILLER + 0xFFF0 <= u <= 0xFFF8 or # Cn [9] .. + 0x1BCA0 <= u <= 0x1BCA3 or # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + 0x1D173 <= u <= 0x1D17A or # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + u == 0xE0000 or # Cn + u == 0xE0001 or # Cf LANGUAGE TAG + 0xE0002 <= u <= 0xE001F or # Cn [30] .. + 0xE0020 <= u <= 0xE007F or # Cf [96] TAG SPACE..CANCEL TAG + 0xE0080 <= u <= 0xE00FF or # Cn [128] .. + 0xE0100 <= u <= 0xE01EF or # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + 0xE01F0 <= u <= 0xE0FFF or # Cn [3600] .. + False) diff --git a/Lib/fontTools/merge/util.py b/Lib/fontTools/merge/util.py new file mode 100644 index 00000000..66cea4d5 --- /dev/null +++ b/Lib/fontTools/merge/util.py @@ -0,0 +1,131 @@ +# Copyright 2013 Google, Inc. All Rights Reserved. +# +# Google Author(s): Behdad Esfahbod, Roozbeh Pournader + +from fontTools.misc.timeTools import timestampNow +from fontTools.ttLib.tables.DefaultTable import DefaultTable +from functools import reduce +import operator +import logging + + +log = logging.getLogger("fontTools.merge") + + +# General utility functions for merging values from different fonts + +def equal(lst): + lst = list(lst) + t = iter(lst) + first = next(t) + assert all(item == first for item in t), "Expected all items to be equal: %s" % lst + return first + +def first(lst): + return next(iter(lst)) + +def recalculate(lst): + return NotImplemented + +def current_time(lst): + return timestampNow() + +def bitwise_and(lst): + return reduce(operator.and_, lst) + +def bitwise_or(lst): + return reduce(operator.or_, lst) + +def avg_int(lst): + lst = list(lst) + return sum(lst) // len(lst) + +def onlyExisting(func): + """Returns a filter func that when called with a list, + only calls func on the non-NotImplemented items of the list, + and only so if there's at least one item remaining. + Otherwise returns NotImplemented.""" + + def wrapper(lst): + items = [item for item in lst if item is not NotImplemented] + return func(items) if items else NotImplemented + + return wrapper + +def sumLists(lst): + l = [] + for item in lst: + l.extend(item) + return l + +def sumDicts(lst): + d = {} + for item in lst: + d.update(item) + return d + +def mergeBits(bitmap): + + def wrapper(lst): + lst = list(lst) + returnValue = 0 + for bitNumber in range(bitmap['size']): + try: + mergeLogic = bitmap[bitNumber] + except KeyError: + try: + mergeLogic = bitmap['*'] + except KeyError: + raise Exception("Don't know how to merge bit %s" % bitNumber) + shiftedBit = 1 << bitNumber + mergedValue = mergeLogic(bool(item & shiftedBit) for item in lst) + returnValue |= mergedValue << bitNumber + return returnValue + + return wrapper + + +class AttendanceRecordingIdentityDict(object): + """A dictionary-like object that records indices of items actually accessed + from a list.""" + + def __init__(self, lst): + self.l = lst + self.d = {id(v):i for i,v in enumerate(lst)} + self.s = set() + + def __getitem__(self, v): + self.s.add(self.d[id(v)]) + return v + +class GregariousIdentityDict(object): + """A dictionary-like object that welcomes guests without reservations and + adds them to the end of the guest list.""" + + def __init__(self, lst): + self.l = lst + self.s = set(id(v) for v in lst) + + def __getitem__(self, v): + if id(v) not in self.s: + self.s.add(id(v)) + self.l.append(v) + return v + +class NonhashableDict(object): + """A dictionary-like object mapping objects to values.""" + + def __init__(self, keys, values=None): + if values is None: + self.d = {id(v):i for i,v in enumerate(keys)} + else: + self.d = {id(k):v for k,v in zip(keys, values)} + + def __getitem__(self, k): + return self.d[id(k)] + + def __setitem__(self, k, v): + self.d[id(k)] = v + + def __delitem__(self, k): + del self.d[id(k)] diff --git a/Lib/fontTools/misc/arrayTools.py b/Lib/fontTools/misc/arrayTools.py index c20a9eda..01ccbe82 100644 --- a/Lib/fontTools/misc/arrayTools.py +++ b/Lib/fontTools/misc/arrayTools.py @@ -17,7 +17,7 @@ def calcBounds(array): Returns: A four-item tuple representing the bounding rectangle ``(xMin, yMin, xMax, yMax)``. """ - if len(array) == 0: + if not array: return 0, 0, 0, 0 xs = [x for x, y in array] ys = [y for x, y in array] diff --git a/Lib/fontTools/misc/bezierTools.py b/Lib/fontTools/misc/bezierTools.py index 2cf2640c..25e5c548 100644 --- a/Lib/fontTools/misc/bezierTools.py +++ b/Lib/fontTools/misc/bezierTools.py @@ -879,12 +879,14 @@ def _line_t_of_pt(s, e, pt): sx, sy = s ex, ey = e px, py = pt - if not math.isclose(sx, ex): + if abs(sx - ex) < epsilon and abs(sy - ey) < epsilon: + # Line is a point! + return -1 + # Use the largest + if abs(sx - ex) > abs(sy - ey): return (px - sx) / (ex - sx) - if not math.isclose(sy, ey): + else: return (py - sy) / (ey - sy) - # Line is a point! - return -1 def _both_points_are_on_same_side_of_origin(a, b, origin): @@ -914,7 +916,7 @@ def lineLineIntersections(s1, e1, s2, e2): >>> intersection.pt (374.44882952482897, 313.73458370177315) >>> (intersection.t1, intersection.t2) - (0.45069111555824454, 0.5408153767394238) + (0.45069111555824465, 0.5408153767394238) """ s1x, s1y = s1 e1x, e1y = e1 @@ -1013,7 +1015,7 @@ def curveLineIntersections(curve, line): >>> len(intersections) 3 >>> intersections[0].pt - (84.90010344084885, 189.87306176459828) + (84.9000930760723, 189.87306176459828) """ if len(curve) == 3: pointFinder = quadraticPointAtT @@ -1024,7 +1026,11 @@ def curveLineIntersections(curve, line): intersections = [] for t in _curve_line_intersections_t(curve, line): pt = pointFinder(*curve, t) - intersections.append(Intersection(pt=pt, t1=t, t2=_line_t_of_pt(*line, pt))) + # Back-project the point onto the line, to avoid problems with + # numerical accuracy in the case of vertical and horizontal lines + line_t = _line_t_of_pt(*line, pt) + pt = linePointAtT(*line, line_t) + intersections.append(Intersection(pt=pt, t1=t, t2=line_t)) return intersections @@ -1169,7 +1175,7 @@ def segmentSegmentIntersections(seg1, seg2): >>> len(intersections) 3 >>> intersections[0].pt - (84.90010344084885, 189.87306176459828) + (84.9000930760723, 189.87306176459828) """ # Arrange by degree diff --git a/Lib/fontTools/misc/eexec.py b/Lib/fontTools/misc/eexec.py index 71f733c1..d1d4bb6a 100644 --- a/Lib/fontTools/misc/eexec.py +++ b/Lib/fontTools/misc/eexec.py @@ -12,7 +12,7 @@ the new key at the end of the operation. """ -from fontTools.misc.py23 import bytechr, bytesjoin, byteord +from fontTools.misc.textTools import bytechr, bytesjoin, byteord def _decryptChar(cipher, R): diff --git a/Lib/fontTools/misc/etree.py b/Lib/fontTools/misc/etree.py index 6e943e4b..cd4df365 100644 --- a/Lib/fontTools/misc/etree.py +++ b/Lib/fontTools/misc/etree.py @@ -11,7 +11,7 @@ or subclasses built-in ElementTree classes to add features that are only availble in lxml, like OrderedDict for attributes, pretty_print and iterwalk. """ -from fontTools.misc.py23 import unicode, tostr +from fontTools.misc.textTools import tostr XML_DECLARATION = """""" @@ -150,9 +150,7 @@ except ImportError: ) return - if encoding is unicode or ( - encoding is not None and encoding.lower() == "unicode" - ): + if encoding is not None and encoding.lower() == "unicode": if xml_declaration: raise ValueError( "Serialisation to unicode must not request an XML declaration" diff --git a/Lib/fontTools/misc/fixedTools.py b/Lib/fontTools/misc/fixedTools.py index f0474abf..6ec7d06e 100644 --- a/Lib/fontTools/misc/fixedTools.py +++ b/Lib/fontTools/misc/fixedTools.py @@ -17,7 +17,7 @@ functions for converting between fixed-point, float and string representations. The maximum value that can still fit in an F2Dot14. (1.99993896484375) """ -from .roundTools import otRound +from .roundTools import otRound, nearestMultipleShortestRepr import logging log = logging.getLogger(__name__) @@ -125,6 +125,7 @@ def fixedToStr(value, precisionBits): This is pretty slow compared to the simple division used in ``fixedToFloat``. Use sporadically when you need to serialize or print the fixed-point number in a human-readable form. + It uses nearestMultipleShortestRepr under the hood. Args: value (int): The fixed-point value to convert. @@ -133,27 +134,8 @@ def fixedToStr(value, precisionBits): Returns: str: A string representation of the value. """ - if not value: return "0.0" - scale = 1 << precisionBits - value /= scale - eps = .5 / scale - lo = value - eps - hi = value + eps - # If the range of valid choices spans an integer, return the integer. - if int(lo) != int(hi): - return str(float(round(value))) - fmt = "%.8f" - lo = fmt % lo - hi = fmt % hi - assert len(lo) == len(hi) and lo != hi - for i in range(len(lo)): - if lo[i] != hi[i]: - break - period = lo.find('.') - assert period < i - fmt = "%%.%df" % (i - period) - return fmt % value + return nearestMultipleShortestRepr(value/scale, factor=1.0/scale) def strToFixed(string, precisionBits): @@ -168,9 +150,9 @@ def strToFixed(string, precisionBits): Examples:: - >>> ## to convert a float string to a 2.14 fixed-point number: - >>> strToFixed('-0.61884', precisionBits=14) - -10139 + >>> ## to convert a float string to a 2.14 fixed-point number: + >>> strToFixed('-0.61884', precisionBits=14) + -10139 """ value = float(string) return otRound(value * (1 << precisionBits)) @@ -214,7 +196,7 @@ def floatToFixedToStr(value, precisionBits): This uses the shortest decimal representation (ie. the least number of fractional decimal digits) to represent the equivalent fixed-point number with ``precisionBits`` fractional binary digits. - It uses fixedToStr under the hood. + It uses nearestMultipleShortestRepr under the hood. >>> floatToFixedToStr(-0.61883544921875, precisionBits=14) '-0.61884' @@ -227,8 +209,8 @@ def floatToFixedToStr(value, precisionBits): str: A string representation of the value. """ - fixed = otRound(value * (1 << precisionBits)) - return fixedToStr(fixed, precisionBits) + scale = 1 << precisionBits + return nearestMultipleShortestRepr(value, factor=1.0/scale) def ensureVersionIsLong(value): diff --git a/Lib/fontTools/misc/intTools.py b/Lib/fontTools/misc/intTools.py index 448e1627..6ba03e16 100644 --- a/Lib/fontTools/misc/intTools.py +++ b/Lib/fontTools/misc/intTools.py @@ -1,28 +1,25 @@ -__all__ = ['popCount'] +__all__ = ["popCount"] -def popCount(v): - """Return number of 1 bits (population count) of an integer. +try: + bit_count = int.bit_count +except AttributeError: - If the integer is negative, the number of 1 bits in the - twos-complement representation of the integer is returned. i.e. - ``popCount(-30) == 28`` because -30 is:: + def bit_count(v): + return bin(v).count("1") - 1111 1111 1111 1111 1111 1111 1110 0010 - Uses the algorithm from `HAKMEM item 169 `_. +"""Return number of 1 bits (population count) of the absolute value of an integer. - Args: - v (int): Value to count. +See https://docs.python.org/3.10/library/stdtypes.html#int.bit_count +""" +popCount = bit_count - Returns: - Number of 1 bits in the binary representation of ``v``. - """ - if v > 0xFFFFFFFF: - return popCount(v >> 32) + popCount(v & 0xFFFFFFFF) +def bit_indices(v): + """Return list of indices where bits are set, 0 being the index of the least significant bit. - # HACKMEM 169 - y = (v >> 1) & 0xDB6DB6DB - y = v - y - ((y >> 1) & 0xDB6DB6DB) - return (((y + (y >> 3)) & 0xC71C71C7) % 0x3F) + >>> bit_indices(0b101) + [0, 2] + """ + return [i for i, b in enumerate(bin(v)[::-1]) if b == "1"] diff --git a/Lib/fontTools/misc/macCreatorType.py b/Lib/fontTools/misc/macCreatorType.py index fb237200..6b191054 100644 --- a/Lib/fontTools/misc/macCreatorType.py +++ b/Lib/fontTools/misc/macCreatorType.py @@ -1,4 +1,4 @@ -from fontTools.misc.py23 import Tag, bytesjoin, strjoin +from fontTools.misc.textTools import Tag, bytesjoin, strjoin try: import xattr except ImportError: @@ -18,7 +18,7 @@ def getMacCreatorAndType(path): path (str): A file path. Returns: - A tuple of two :py:class:`fontTools.py23.Tag` objects, the first + A tuple of two :py:class:`fontTools.textTools.Tag` objects, the first representing the file creator and the second representing the file type. """ diff --git a/Lib/fontTools/misc/macRes.py b/Lib/fontTools/misc/macRes.py index 2c15b347..895ca1b8 100644 --- a/Lib/fontTools/misc/macRes.py +++ b/Lib/fontTools/misc/macRes.py @@ -1,7 +1,7 @@ -from fontTools.misc.py23 import bytesjoin, tostr from io import BytesIO import struct from fontTools.misc import sstruct +from fontTools.misc.textTools import bytesjoin, tostr from collections import OrderedDict from collections.abc import MutableMapping diff --git a/Lib/fontTools/misc/plistlib/__init__.py b/Lib/fontTools/misc/plistlib/__init__.py index 84dc4183..eb4b5259 100644 --- a/Lib/fontTools/misc/plistlib/__init__.py +++ b/Lib/fontTools/misc/plistlib/__init__.py @@ -23,7 +23,7 @@ from functools import singledispatch from fontTools.misc import etree -from fontTools.misc.py23 import tostr +from fontTools.misc.textTools import tostr # By default, we @@ -151,7 +151,7 @@ PlistEncodable = Union[ Data, datetime, float, - int, + Integral, Mapping[str, Any], Sequence[Any], str, diff --git a/Lib/fontTools/misc/psCharStrings.py b/Lib/fontTools/misc/psCharStrings.py index cb675050..29c2d365 100644 --- a/Lib/fontTools/misc/psCharStrings.py +++ b/Lib/fontTools/misc/psCharStrings.py @@ -2,10 +2,10 @@ CFF dictionary data and Type1/Type2 CharStrings. """ -from fontTools.misc.py23 import bytechr, byteord, bytesjoin, strjoin from fontTools.misc.fixedTools import ( fixedToFloat, floatToFixed, floatToFixedToStr, strToFixedToFloat, ) +from fontTools.misc.textTools import bytechr, byteord, bytesjoin, strjoin from fontTools.pens.boundsPen import BoundsPen import struct import logging diff --git a/Lib/fontTools/misc/psLib.py b/Lib/fontTools/misc/psLib.py index 916755ce..a6c8b8b5 100644 --- a/Lib/fontTools/misc/psLib.py +++ b/Lib/fontTools/misc/psLib.py @@ -1,4 +1,4 @@ -from fontTools.misc.py23 import bytechr, byteord, bytesjoin, tobytes, tostr +from fontTools.misc.textTools import bytechr, byteord, bytesjoin, tobytes, tostr from fontTools.misc import eexec from .psOperators import ( PSOperators, @@ -365,6 +365,7 @@ def suckfont(data, encoding="ascii"): m = re.search(br"/FontName\s+/([^ \t\n\r]+)\s+def", data) if m: fontName = m.group(1) + fontName = fontName.decode() else: fontName = None interpreter = PSInterpreter(encoding=encoding) diff --git a/Lib/fontTools/misc/py23.py b/Lib/fontTools/misc/py23.py index 9096e2ef..29f634d6 100644 --- a/Lib/fontTools/misc/py23.py +++ b/Lib/fontTools/misc/py23.py @@ -8,6 +8,8 @@ from io import BytesIO from io import StringIO as UnicodeIO from types import SimpleNamespace +from .textTools import Tag, bytechr, byteord, bytesjoin, strjoin, tobytes, tostr + warnings.warn( "The py23 module has been deprecated and will be removed in a future release. " "Please update your code.", @@ -57,61 +59,7 @@ unichr = chr unicode = str zip = zip - -def bytechr(n): - return bytes([n]) - - -def byteord(c): - return c if isinstance(c, int) else ord(c) - - -def strjoin(iterable, joiner=""): - return tostr(joiner).join(iterable) - - -def tobytes(s, encoding="ascii", errors="strict"): - if not isinstance(s, bytes): - return s.encode(encoding, errors) - else: - return s - - -def tounicode(s, encoding="ascii", errors="strict"): - if not isinstance(s, unicode): - return s.decode(encoding, errors) - else: - return s - - -tostr = tounicode - - -class Tag(str): - @staticmethod - def transcode(blob): - if isinstance(blob, bytes): - blob = blob.decode("latin-1") - return blob - - def __new__(self, content): - return str.__new__(self, self.transcode(content)) - - def __ne__(self, other): - return not self.__eq__(other) - - def __eq__(self, other): - return str.__eq__(self, self.transcode(other)) - - def __hash__(self): - return str.__hash__(self) - - def tobytes(self): - return self.encode("latin-1") - - -def bytesjoin(iterable, joiner=b""): - return tobytes(joiner).join(tobytes(item) for item in iterable) +tounicode = tostr def xrange(*args, **kwargs): diff --git a/Lib/fontTools/misc/roundTools.py b/Lib/fontTools/misc/roundTools.py index c1d546f1..6f4aa634 100644 --- a/Lib/fontTools/misc/roundTools.py +++ b/Lib/fontTools/misc/roundTools.py @@ -56,3 +56,50 @@ def roundFunc(tolerance, round=otRound): return round return functools.partial(maybeRound, tolerance=tolerance, round=round) + + +def nearestMultipleShortestRepr(value: float, factor: float) -> str: + """Round to nearest multiple of factor and return shortest decimal representation. + + This chooses the float that is closer to a multiple of the given factor while + having the shortest decimal representation (the least number of fractional decimal + digits). + + For example, given the following: + + >>> nearestMultipleShortestRepr(-0.61883544921875, 1.0/(1<<14)) + '-0.61884' + + Useful when you need to serialize or print a fixed-point number (or multiples + thereof, such as F2Dot14 fractions of 180 degrees in COLRv1 PaintRotate) in + a human-readable form. + + Args: + value (value): The value to be rounded and serialized. + factor (float): The value which the result is a close multiple of. + + Returns: + str: A compact string representation of the value. + """ + if not value: + return "0.0" + + value = otRound(value / factor) * factor + eps = .5 * factor + lo = value - eps + hi = value + eps + # If the range of valid choices spans an integer, return the integer. + if int(lo) != int(hi): + return str(float(round(value))) + + fmt = "%.8f" + lo = fmt % lo + hi = fmt % hi + assert len(lo) == len(hi) and lo != hi + for i in range(len(lo)): + if lo[i] != hi[i]: + break + period = lo.find('.') + assert period < i + fmt = "%%.%df" % (i - period) + return fmt % value diff --git a/Lib/fontTools/misc/sstruct.py b/Lib/fontTools/misc/sstruct.py index ba1f8788..6db8b515 100644 --- a/Lib/fontTools/misc/sstruct.py +++ b/Lib/fontTools/misc/sstruct.py @@ -46,8 +46,8 @@ calcsize(fmt) it returns the size of the data in bytes. """ -from fontTools.misc.py23 import tobytes, tostr from fontTools.misc.fixedTools import fixedToFloat as fi2fl, floatToFixed as fl2fi +from fontTools.misc.textTools import tobytes, tostr import struct import re @@ -59,7 +59,7 @@ class Error(Exception): pass def pack(fmt, obj): - formatstring, names, fixes = getformat(fmt) + formatstring, names, fixes = getformat(fmt, keep_pad_byte=True) elements = [] if not isinstance(obj, dict): obj = obj.__dict__ @@ -112,7 +112,8 @@ _elementRE = re.compile( r"\s*" # whitespace r"([A-Za-z_][A-Za-z_0-9]*)" # name (python identifier) r"\s*:\s*" # whitespace : whitespace - r"([cbBhHiIlLqQfd]|[0-9]+[ps]|" # formatchar... + r"([xcbB?hHiIlLqQfd]|" # formatchar... + r"[0-9]+[ps]|" # ...formatchar... r"([0-9]+)\.([0-9]+)(F))" # ...formatchar r"\s*" # whitespace r"(#.*)?$" # [comment] + end of string @@ -131,7 +132,7 @@ _fixedpointmappings = { _formatcache = {} -def getformat(fmt): +def getformat(fmt, keep_pad_byte=False): fmt = tostr(fmt, encoding="ascii") try: formatstring, names, fixes = _formatcache[fmt] @@ -153,8 +154,9 @@ def getformat(fmt): if not m: raise Error("syntax error in fmt: '%s'" % line) name = m.group(1) - names.append(name) formatchar = m.group(2) + if keep_pad_byte or formatchar != "x": + names.append(name) if m.group(3): # fixed point before = int(m.group(3)) @@ -182,6 +184,8 @@ def _test(): astr: 5s afloat: f; adouble: d # multiple "statements" are allowed afixed: 16.16F + abool: ? + apad: x """ print('size:', calcsize(fmt)) @@ -199,6 +203,7 @@ def _test(): i.afloat = 0.5 i.adouble = 0.5 i.afixed = 1.5 + i.abool = True data = pack(fmt, i) print('data:', repr(data)) diff --git a/Lib/fontTools/misc/testTools.py b/Lib/fontTools/misc/testTools.py index 1b258e37..db316a82 100644 --- a/Lib/fontTools/misc/testTools.py +++ b/Lib/fontTools/misc/testTools.py @@ -7,7 +7,7 @@ import shutil import sys import tempfile from unittest import TestCase as _TestCase -from fontTools.misc.py23 import tobytes +from fontTools.misc.textTools import tobytes from fontTools.misc.xmlWriter import XMLWriter @@ -38,6 +38,14 @@ def parseXML(xmlSnippet): return reader.root[2] +def parseXmlInto(font, parseInto, xmlSnippet): + parsed_xml = [e for e in parseXML(xmlSnippet.strip()) if not isinstance(e, str)] + for name, attrs, content in parsed_xml: + parseInto.fromXML(name, attrs, content, font) + parseInto.populateDefaults() + return parseInto + + class FakeFont: def __init__(self, glyphs): self.glyphOrder_ = glyphs @@ -57,11 +65,16 @@ class FakeFont: def getGlyphID(self, name): return self.reverseGlyphOrderDict_[name] + def getGlyphIDMany(self, lst): + return [self.getGlyphID(gid) for gid in lst] + def getGlyphName(self, glyphID): if glyphID < len(self.glyphOrder_): return self.glyphOrder_[glyphID] else: return "glyph%.5d" % glyphID + def getGlyphNameMany(self, lst): + return [self.getGlyphName(gid) for gid in lst] def getGlyphOrder(self): return self.glyphOrder_ @@ -136,7 +149,7 @@ class MockFont(object): self._reverseGlyphOrder = AllocatingDict({'.notdef': 0}) self.lazy = False - def getGlyphID(self, glyph, requireReal=None): + def getGlyphID(self, glyph): gid = self._reverseGlyphOrder[glyph] return gid diff --git a/Lib/fontTools/misc/textTools.py b/Lib/fontTools/misc/textTools.py index 072976af..bf75bcbd 100644 --- a/Lib/fontTools/misc/textTools.py +++ b/Lib/fontTools/misc/textTools.py @@ -1,7 +1,6 @@ """fontTools.misc.textTools.py -- miscellaneous routines.""" -from fontTools.misc.py23 import bytechr, byteord, bytesjoin, strjoin, tobytes import ast import string @@ -10,6 +9,29 @@ import string safeEval = ast.literal_eval +class Tag(str): + @staticmethod + def transcode(blob): + if isinstance(blob, bytes): + blob = blob.decode("latin-1") + return blob + + def __new__(self, content): + return str.__new__(self, self.transcode(content)) + + def __ne__(self, other): + return not self.__eq__(other) + + def __eq__(self, other): + return str.__eq__(self, self.transcode(other)) + + def __hash__(self): + return str.__hash__(self) + + def tobytes(self): + return self.encode("latin-1") + + def readHex(content): """Convert a list of hex strings to binary data.""" return deHexStr(strjoin(chunk for chunk in content if isinstance(chunk, str))) @@ -97,6 +119,36 @@ def pad(data, size): return data +def tostr(s, encoding="ascii", errors="strict"): + if not isinstance(s, str): + return s.decode(encoding, errors) + else: + return s + + +def tobytes(s, encoding="ascii", errors="strict"): + if isinstance(s, str): + return s.encode(encoding, errors) + else: + return bytes(s) + + +def bytechr(n): + return bytes([n]) + + +def byteord(c): + return c if isinstance(c, int) else ord(c) + + +def strjoin(iterable, joiner=""): + return tostr(joiner).join(iterable) + + +def bytesjoin(iterable, joiner=b""): + return tobytes(joiner).join(tobytes(item) for item in iterable) + + if __name__ == "__main__": import doctest, sys sys.exit(doctest.testmod().failed) diff --git a/Lib/fontTools/misc/transform.py b/Lib/fontTools/misc/transform.py index 997598f5..94e1f622 100644 --- a/Lib/fontTools/misc/transform.py +++ b/Lib/fontTools/misc/transform.py @@ -10,12 +10,16 @@ used as dictionary keys. This module exports the following symbols: - Transform -- this is the main class - Identity -- Transform instance set to the identity transformation - Offset -- Convenience function that returns a translating transformation - Scale -- Convenience function that returns a scaling transformation +Transform + this is the main class +Identity + Transform instance set to the identity transformation +Offset + Convenience function that returns a translating transformation +Scale + Convenience function that returns a scaling transformation -Examples: +:Example: >>> t = Transform(2, 0, 0, 3, 0, 0) >>> t.transformPoint((100, 100)) @@ -72,7 +76,8 @@ class Transform(NamedTuple): Transform instances are immutable: all transforming methods, eg. rotate(), return a new Transform instance. - Examples: + :Example: + >>> t = Transform() >>> t @@ -85,7 +90,8 @@ class Transform(NamedTuple): (200, 300) Transform's constructor takes six arguments, all of which are - optional, and can be used as keyword arguments: + optional, and can be used as keyword arguments:: + >>> Transform(12) >>> Transform(dx=12) @@ -93,7 +99,8 @@ class Transform(NamedTuple): >>> Transform(yx=12) - Transform instances also behave like sequences of length 6: + Transform instances also behave like sequences of length 6:: + >>> len(Identity) 6 >>> list(Identity) @@ -101,13 +108,15 @@ class Transform(NamedTuple): >>> tuple(Identity) (1, 0, 0, 1, 0, 0) - Transform instances are comparable: + Transform instances are comparable:: + >>> t1 = Identity.scale(2, 3).translate(4, 6) >>> t2 = Identity.translate(8, 18).scale(2, 3) >>> t1 == t2 1 - But beware of floating point rounding errors: + But beware of floating point rounding errors:: + >>> t1 = Identity.scale(0.2, 0.3).translate(0.4, 0.6) >>> t2 = Identity.translate(0.08, 0.18).scale(0.2, 0.3) >>> t1 @@ -118,12 +127,14 @@ class Transform(NamedTuple): 0 Transform instances are hashable, meaning you can use them as - keys in dictionaries: + keys in dictionaries:: + >>> d = {Scale(12, 13): None} >>> d {: None} - But again, beware of floating point rounding errors: + But again, beware of floating point rounding errors:: + >>> t1 = Identity.scale(0.2, 0.3).translate(0.4, 0.6) >>> t2 = Identity.translate(0.08, 0.18).scale(0.2, 0.3) >>> t1 @@ -149,7 +160,8 @@ class Transform(NamedTuple): def transformPoint(self, p): """Transform a point. - Example: + :Example: + >>> t = Transform() >>> t = t.scale(2.5, 5.5) >>> t.transformPoint((100, 100)) @@ -162,7 +174,8 @@ class Transform(NamedTuple): def transformPoints(self, points): """Transform a list of points. - Example: + :Example: + >>> t = Scale(2, 3) >>> t.transformPoints([(0, 0), (0, 100), (100, 100), (100, 0)]) [(0, 0), (0, 300), (200, 300), (200, 0)] @@ -171,10 +184,36 @@ class Transform(NamedTuple): xx, xy, yx, yy, dx, dy = self return [(xx*x + yx*y + dx, xy*x + yy*y + dy) for x, y in points] + def transformVector(self, v): + """Transform an (dx, dy) vector, treating translation as zero. + + :Example: + + >>> t = Transform(2, 0, 0, 2, 10, 20) + >>> t.transformVector((3, -4)) + (6, -8) + >>> + """ + (dx, dy) = v + xx, xy, yx, yy = self[:4] + return (xx*dx + yx*dy, xy*dx + yy*dy) + + def transformVectors(self, vectors): + """Transform a list of (dx, dy) vector, treating translation as zero. + + :Example: + >>> t = Transform(2, 0, 0, 2, 10, 20) + >>> t.transformVectors([(3, -4), (5, -6)]) + [(6, -8), (10, -12)] + >>> + """ + xx, xy, yx, yy = self[:4] + return [(xx*dx + yx*dy, xy*dx + yy*dy) for dx, dy in vectors] + def translate(self, x=0, y=0): """Return a new transformation, translated (offset) by x, y. - Example: + :Example: >>> t = Transform() >>> t.translate(20, 30) @@ -186,7 +225,7 @@ class Transform(NamedTuple): """Return a new transformation, scaled by x, y. The 'y' argument may be None, which implies to use the x value for y as well. - Example: + :Example: >>> t = Transform() >>> t.scale(5) @@ -201,7 +240,7 @@ class Transform(NamedTuple): def rotate(self, angle): """Return a new transformation, rotated by 'angle' (radians). - Example: + :Example: >>> import math >>> t = Transform() >>> t.rotate(math.pi / 2) @@ -216,7 +255,7 @@ class Transform(NamedTuple): def skew(self, x=0, y=0): """Return a new transformation, skewed by x and y. - Example: + :Example: >>> import math >>> t = Transform() >>> t.skew(math.pi / 4) @@ -230,7 +269,7 @@ class Transform(NamedTuple): """Return a new transformation, transformed by another transformation. - Example: + :Example: >>> t = Transform(2, 0, 0, 3, 1, 6) >>> t.transform((4, 3, 2, 1, 5, 6)) @@ -251,7 +290,7 @@ class Transform(NamedTuple): transformed by self. self.reverseTransform(other) is equivalent to other.transform(self). - Example: + :Example: >>> t = Transform(2, 0, 0, 3, 1, 6) >>> t.reverseTransform((4, 3, 2, 1, 5, 6)) @@ -272,7 +311,7 @@ class Transform(NamedTuple): def inverse(self): """Return the inverse transformation. - Example: + :Example: >>> t = Identity.translate(2, 3).scale(4, 5) >>> t.transformPoint((10, 20)) (42, 103) @@ -290,7 +329,10 @@ class Transform(NamedTuple): return self.__class__(xx, xy, yx, yy, dx, dy) def toPS(self): - """Return a PostScript representation: + """Return a PostScript representation + + :Example: + >>> t = Identity.scale(2, 3).translate(4, 5) >>> t.toPS() '[2 0 0 3 8 15]' @@ -300,6 +342,9 @@ class Transform(NamedTuple): def __bool__(self): """Returns True if transform is not identity, False otherwise. + + :Example: + >>> bool(Identity) False >>> bool(Transform()) @@ -326,7 +371,7 @@ Identity = Transform() def Offset(x=0, y=0): """Return the identity transformation offset by x, y. - Example: + :Example: >>> Offset(2, 3) >>> @@ -337,7 +382,7 @@ def Scale(x, y=None): """Return the identity transformation scaled by x, y. The 'y' argument may be None, which implies to use the x value for y as well. - Example: + :Example: >>> Scale(2, 3) >>> diff --git a/Lib/fontTools/misc/xmlReader.py b/Lib/fontTools/misc/xmlReader.py index b2707e99..6ec50de4 100644 --- a/Lib/fontTools/misc/xmlReader.py +++ b/Lib/fontTools/misc/xmlReader.py @@ -93,11 +93,12 @@ class XMLReader(object): if not stackSize: if name != "ttFont": raise TTXParseError("illegal root tag: %s" % name) - sfntVersion = attrs.get("sfntVersion") - if sfntVersion is not None: - if len(sfntVersion) != 4: - sfntVersion = safeEval('"' + sfntVersion + '"') - self.ttFont.sfntVersion = sfntVersion + if self.ttFont.reader is None and not self.ttFont.tables: + sfntVersion = attrs.get("sfntVersion") + if sfntVersion is not None: + if len(sfntVersion) != 4: + sfntVersion = safeEval('"' + sfntVersion + '"') + self.ttFont.sfntVersion = sfntVersion self.contentStack.append([]) elif stackSize == 1: if subFile is not None: diff --git a/Lib/fontTools/misc/xmlWriter.py b/Lib/fontTools/misc/xmlWriter.py index fec127a9..9e30fa33 100644 --- a/Lib/fontTools/misc/xmlWriter.py +++ b/Lib/fontTools/misc/xmlWriter.py @@ -1,6 +1,6 @@ """xmlWriter.py -- Simple XML authoring class""" -from fontTools.misc.py23 import byteord, strjoin, tobytes, tostr +from fontTools.misc.textTools import byteord, strjoin, tobytes, tostr import sys import os import string @@ -11,7 +11,7 @@ INDENT = " " class XMLWriter(object): def __init__(self, fileOrPath, indentwhite=INDENT, idlefunc=None, encoding="utf_8", - newlinestr=None): + newlinestr="\n"): if encoding.lower().replace('-','').replace('_','') != 'utf8': raise Exception('Only UTF-8 encoding is supported.') if fileOrPath == '-': diff --git a/Lib/fontTools/otlLib/builder.py b/Lib/fontTools/otlLib/builder.py index 182f7da6..e3f33551 100644 --- a/Lib/fontTools/otlLib/builder.py +++ b/Lib/fontTools/otlLib/builder.py @@ -1,4 +1,5 @@ from collections import namedtuple, OrderedDict +import os from fontTools.misc.fixedTools import fixedToFloat from fontTools import ttLib from fontTools.ttLib.tables import otTables as ot @@ -10,6 +11,11 @@ from fontTools.ttLib.tables.otBase import ( ) from fontTools.ttLib.tables import otBase from fontTools.feaLib.ast import STATNameStatement +from fontTools.otlLib.optimize.gpos import ( + GPOS_COMPACT_MODE_DEFAULT, + GPOS_COMPACT_MODE_ENV_KEY, + compact_lookup, +) from fontTools.otlLib.error import OpenTypeLibError from functools import reduce import logging @@ -22,7 +28,7 @@ log = logging.getLogger(__name__) def buildCoverage(glyphs, glyphMap): """Builds a coverage table. - Coverage tables (as defined in the `OpenType spec `_) + Coverage tables (as defined in the `OpenType spec `__) are used in all OpenType Layout lookups apart from the Extension type, and define the glyphs involved in a layout subtable. This allows shaping engines to compare the glyph stream with the coverage table and quickly determine @@ -50,7 +56,7 @@ def buildCoverage(glyphs, glyphMap): if not glyphs: return None self = ot.Coverage() - self.glyphs = sorted(glyphs, key=glyphMap.__getitem__) + self.glyphs = sorted(set(glyphs), key=glyphMap.__getitem__) return self @@ -64,7 +70,7 @@ LOOKUP_FLAG_USE_MARK_FILTERING_SET = 0x0010 def buildLookup(subtables, flags=0, markFilterSet=None): """Turns a collection of rules into a lookup. - A Lookup (as defined in the `OpenType Spec `_) + A Lookup (as defined in the `OpenType Spec `__) wraps the individual rules in a layout operation (substitution or positioning) in a data structure expressing their overall lookup type - for example, single substitution, mark-to-base attachment, and so on - @@ -386,7 +392,21 @@ class ChainContextualBuilder(LookupBuilder): if not ruleset.hasAnyGlyphClasses: candidates[1] = [self.buildFormat1Subtable(ruleset, chaining)] + for i in [1, 2, 3]: + if candidates[i]: + try: + self.getCompiledSize_(candidates[i]) + except Exception as e: + log.warning( + "Contextual format %i at %s overflowed (%s)" + % (i, str(self.location), e) + ) + candidates[i] = None + candidates = [x for x in candidates if x is not None] + if not candidates: + raise OpenTypeLibError("All candidates overflowed", self.location) + winner = min(candidates, key=self.getCompiledSize_) subtables.extend(winner) @@ -943,12 +963,22 @@ class MarkBasePosBuilder(LookupBuilder): positioning lookup. """ markClasses = self.buildMarkClasses_(self.marks) - marks = { - mark: (markClasses[mc], anchor) for mark, (mc, anchor) in self.marks.items() - } + marks = {} + for mark, (mc, anchor) in self.marks.items(): + if mc not in markClasses: + raise ValueError( + "Mark class %s not found for mark glyph %s" % (mc, mark) + ) + marks[mark] = (markClasses[mc], anchor) bases = {} for glyph, anchors in self.bases.items(): - bases[glyph] = {markClasses[mc]: anchor for (mc, anchor) in anchors.items()} + bases[glyph] = {} + for mc, anchor in anchors.items(): + if mc not in markClasses: + raise ValueError( + "Mark class %s not found for base glyph %s" % (mc, mark) + ) + bases[glyph][markClasses[mc]] = anchor subtables = buildMarkBasePos(marks, bases, self.glyphMap) return self.buildLookup_(subtables) @@ -1373,7 +1403,17 @@ class PairPosBuilder(LookupBuilder): subtables.extend(buildPairPosGlyphs(self.glyphPairs, self.glyphMap)) for key in sorted(builders.keys()): subtables.extend(builders[key].subtables()) - return self.buildLookup_(subtables) + lookup = self.buildLookup_(subtables) + + # Compact the lookup + # This is a good moment to do it because the compaction should create + # smaller subtables, which may prevent overflows from happening. + mode = os.environ.get(GPOS_COMPACT_MODE_ENV_KEY, GPOS_COMPACT_MODE_DEFAULT) + if mode and mode != "0": + log.info("Compacting GPOS...") + compact_lookup(self.font, mode, lookup) + + return lookup class SinglePosBuilder(LookupBuilder): @@ -2091,8 +2131,16 @@ def buildPairPosClassesSubtable(pairs, glyphMap, valueFormat1=None, valueFormat2 for c2 in classes2: rec2 = ot.Class2Record() val1, val2 = pairs.get((c1, c2), (None, None)) - rec2.Value1 = ValueRecord(src=val1, valueFormat=valueFormat1) if valueFormat1 else None - rec2.Value2 = ValueRecord(src=val2, valueFormat=valueFormat2) if valueFormat2 else None + rec2.Value1 = ( + ValueRecord(src=val1, valueFormat=valueFormat1) + if valueFormat1 + else None + ) + rec2.Value2 = ( + ValueRecord(src=val2, valueFormat=valueFormat2) + if valueFormat2 + else None + ) rec1.Class2Record.append(rec2) self.Class1Count = len(self.Class1Record) self.Class2Count = len(classes2) @@ -2191,8 +2239,16 @@ def buildPairPosGlyphsSubtable(pairs, glyphMap, valueFormat1=None, valueFormat2= for glyph2, val1, val2 in sorted(p[glyph], key=lambda x: glyphMap[x[0]]): pvr = ot.PairValueRecord() pvr.SecondGlyph = glyph2 - pvr.Value1 = ValueRecord(src=val1, valueFormat=valueFormat1) if valueFormat1 else None - pvr.Value2 = ValueRecord(src=val2, valueFormat=valueFormat2) if valueFormat2 else None + pvr.Value1 = ( + ValueRecord(src=val1, valueFormat=valueFormat1) + if valueFormat1 + else None + ) + pvr.Value2 = ( + ValueRecord(src=val2, valueFormat=valueFormat2) + if valueFormat2 + else None + ) ps.PairValueRecord.append(pvr) ps.PairValueCount = len(ps.PairValueRecord) self.PairSetCount = len(self.PairSet) @@ -2313,8 +2369,13 @@ def buildSinglePosSubtable(values, glyphMap): """ self = ot.SinglePos() self.Coverage = buildCoverage(values.keys(), glyphMap) - valueFormat = self.ValueFormat = reduce(int.__or__, [v.getFormat() for v in values.values()], 0) - valueRecords = [ValueRecord(src=values[g], valueFormat=valueFormat) for g in self.Coverage.glyphs] + valueFormat = self.ValueFormat = reduce( + int.__or__, [v.getFormat() for v in values.values()], 0 + ) + valueRecords = [ + ValueRecord(src=values[g], valueFormat=valueFormat) + for g in self.Coverage.glyphs + ] if all(v == valueRecords[0] for v in valueRecords): self.Format = 1 if self.ValueFormat != 0: @@ -2617,7 +2678,9 @@ AXIS_VALUE_NEGATIVE_INFINITY = fixedToFloat(-0x80000000, 16) AXIS_VALUE_POSITIVE_INFINITY = fixedToFloat(0x7FFFFFFF, 16) -def buildStatTable(ttFont, axes, locations=None, elidedFallbackName=2): +def buildStatTable( + ttFont, axes, locations=None, elidedFallbackName=2, windowsNames=True, macNames=True +): """Add a 'STAT' table to 'ttFont'. 'axes' is a list of dictionaries describing axes and their @@ -2702,17 +2765,23 @@ def buildStatTable(ttFont, axes, locations=None, elidedFallbackName=2): ttFont["STAT"] = ttLib.newTable("STAT") statTable = ttFont["STAT"].table = ot.STAT() nameTable = ttFont["name"] - statTable.ElidedFallbackNameID = _addName(nameTable, elidedFallbackName) + statTable.ElidedFallbackNameID = _addName( + nameTable, elidedFallbackName, windows=windowsNames, mac=macNames + ) # 'locations' contains data for AxisValue Format 4 - axisRecords, axisValues = _buildAxisRecords(axes, nameTable) + axisRecords, axisValues = _buildAxisRecords( + axes, nameTable, windowsNames=windowsNames, macNames=macNames + ) if not locations: statTable.Version = 0x00010001 else: # We'll be adding Format 4 AxisValue records, which # requires a higher table version statTable.Version = 0x00010002 - multiAxisValues = _buildAxisValuesFormat4(locations, axes, nameTable) + multiAxisValues = _buildAxisValuesFormat4( + locations, axes, nameTable, windowsNames=windowsNames, macNames=macNames + ) axisValues = multiAxisValues + axisValues # Store AxisRecords @@ -2731,13 +2800,15 @@ def buildStatTable(ttFont, axes, locations=None, elidedFallbackName=2): statTable.AxisValueCount = len(axisValues) -def _buildAxisRecords(axes, nameTable): +def _buildAxisRecords(axes, nameTable, windowsNames=True, macNames=True): axisRecords = [] axisValues = [] for axisRecordIndex, axisDict in enumerate(axes): axis = ot.AxisRecord() axis.AxisTag = axisDict["tag"] - axis.AxisNameID = _addName(nameTable, axisDict["name"], 256) + axis.AxisNameID = _addName( + nameTable, axisDict["name"], 256, windows=windowsNames, mac=macNames + ) axis.AxisOrdering = axisDict.get("ordering", axisRecordIndex) axisRecords.append(axis) @@ -2745,7 +2816,9 @@ def _buildAxisRecords(axes, nameTable): axisValRec = ot.AxisValue() axisValRec.AxisIndex = axisRecordIndex axisValRec.Flags = axisVal.get("flags", 0) - axisValRec.ValueNameID = _addName(nameTable, axisVal["name"]) + axisValRec.ValueNameID = _addName( + nameTable, axisVal["name"], windows=windowsNames, mac=macNames + ) if "value" in axisVal: axisValRec.Value = axisVal["value"] @@ -2770,7 +2843,9 @@ def _buildAxisRecords(axes, nameTable): return axisRecords, axisValues -def _buildAxisValuesFormat4(locations, axes, nameTable): +def _buildAxisValuesFormat4( + locations, axes, nameTable, windowsNames=True, macNames=True +): axisTagToIndex = {} for axisRecordIndex, axisDict in enumerate(axes): axisTagToIndex[axisDict["tag"]] = axisRecordIndex @@ -2779,7 +2854,9 @@ def _buildAxisValuesFormat4(locations, axes, nameTable): for axisLocationDict in locations: axisValRec = ot.AxisValue() axisValRec.Format = 4 - axisValRec.ValueNameID = _addName(nameTable, axisLocationDict["name"]) + axisValRec.ValueNameID = _addName( + nameTable, axisLocationDict["name"], windows=windowsNames, mac=macNames + ) axisValRec.Flags = axisLocationDict.get("flags", 0) axisValueRecords = [] for tag, value in axisLocationDict["location"].items(): @@ -2794,7 +2871,7 @@ def _buildAxisValuesFormat4(locations, axes, nameTable): return axisValues -def _addName(nameTable, value, minNameID=0): +def _addName(nameTable, value, minNameID=0, windows=True, mac=True): if isinstance(value, int): # Already a nameID return value @@ -2818,4 +2895,6 @@ def _addName(nameTable, value, minNameID=0): return nameID else: raise TypeError("value must be int, str, dict or list") - return nameTable.addMultilingualName(names, minNameID=minNameID) + return nameTable.addMultilingualName( + names, windows=windows, mac=mac, minNameID=minNameID + ) diff --git a/Lib/fontTools/otlLib/optimize/__init__.py b/Lib/fontTools/otlLib/optimize/__init__.py new file mode 100644 index 00000000..5c007e89 --- /dev/null +++ b/Lib/fontTools/otlLib/optimize/__init__.py @@ -0,0 +1,68 @@ +from argparse import RawTextHelpFormatter +from textwrap import dedent + +from fontTools.ttLib import TTFont +from fontTools.otlLib.optimize.gpos import compact, GPOS_COMPACT_MODE_DEFAULT + +def main(args=None): + """Optimize the layout tables of an existing font.""" + from argparse import ArgumentParser + from fontTools import configLogger + + parser = ArgumentParser(prog="otlLib.optimize", description=main.__doc__, formatter_class=RawTextHelpFormatter) + parser.add_argument("font") + parser.add_argument( + "-o", metavar="OUTPUTFILE", dest="outfile", default=None, help="output file" + ) + parser.add_argument( + "--gpos-compact-mode", + help=dedent( + f"""\ + GPOS Lookup type 2 (PairPos) compaction mode: + 0 = do not attempt to compact PairPos lookups; + 1 to 8 = create at most 1 to 8 new subtables for each existing + subtable, provided that it would yield a 50%% file size saving; + 9 = create as many new subtables as needed to yield a file size saving. + Default: {GPOS_COMPACT_MODE_DEFAULT}. + + This compaction aims to save file size, by splitting large class + kerning subtables (Format 2) that contain many zero values into + smaller and denser subtables. It's a trade-off between the overhead + of several subtables versus the sparseness of one big subtable. + + See the pull request: https://github.com/fonttools/fonttools/pull/2326 + """ + ), + default=int(GPOS_COMPACT_MODE_DEFAULT), + choices=list(range(10)), + type=int, + ) + logging_group = parser.add_mutually_exclusive_group(required=False) + logging_group.add_argument( + "-v", "--verbose", action="store_true", help="Run more verbosely." + ) + logging_group.add_argument( + "-q", "--quiet", action="store_true", help="Turn verbosity off." + ) + options = parser.parse_args(args) + + configLogger( + level=("DEBUG" if options.verbose else "ERROR" if options.quiet else "INFO") + ) + + font = TTFont(options.font) + # TODO: switch everything to have type(mode) = int when using the Config class + compact(font, str(options.gpos_compact_mode)) + font.save(options.outfile or options.font) + + + +if __name__ == "__main__": + import sys + + if len(sys.argv) > 1: + sys.exit(main()) + import doctest + + sys.exit(doctest.testmod().failed) + diff --git a/Lib/fontTools/otlLib/optimize/__main__.py b/Lib/fontTools/otlLib/optimize/__main__.py new file mode 100644 index 00000000..03027ecd --- /dev/null +++ b/Lib/fontTools/otlLib/optimize/__main__.py @@ -0,0 +1,6 @@ +import sys +from fontTools.otlLib.optimize import main + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/Lib/fontTools/otlLib/optimize/gpos.py b/Lib/fontTools/otlLib/optimize/gpos.py new file mode 100644 index 00000000..79873fad --- /dev/null +++ b/Lib/fontTools/otlLib/optimize/gpos.py @@ -0,0 +1,439 @@ +import logging +from collections import defaultdict, namedtuple +from functools import reduce +from itertools import chain +from math import log2 +from typing import DefaultDict, Dict, Iterable, List, Sequence, Tuple + +from fontTools.misc.intTools import bit_count, bit_indices +from fontTools.ttLib import TTFont +from fontTools.ttLib.tables import otBase, otTables + +# NOTE: activating this optimization via the environment variable is +# experimental and may not be supported once an alternative mechanism +# is in place. See: https://github.com/fonttools/fonttools/issues/2349 +GPOS_COMPACT_MODE_ENV_KEY = "FONTTOOLS_GPOS_COMPACT_MODE" +GPOS_COMPACT_MODE_DEFAULT = "0" + +log = logging.getLogger("fontTools.otlLib.optimize.gpos") + + +def compact(font: TTFont, mode: str) -> TTFont: + # Ideal plan: + # 1. Find lookups of Lookup Type 2: Pair Adjustment Positioning Subtable + # https://docs.microsoft.com/en-us/typography/opentype/spec/gpos#lookup-type-2-pair-adjustment-positioning-subtable + # 2. Extract glyph-glyph kerning and class-kerning from all present subtables + # 3. Regroup into different subtable arrangements + # 4. Put back into the lookup + # + # Actual implementation: + # 2. Only class kerning is optimized currently + # 3. If the input kerning is already in several subtables, the subtables + # are not grouped together first; instead each subtable is treated + # independently, so currently this step is: + # Split existing subtables into more smaller subtables + gpos = font["GPOS"] + for lookup in gpos.table.LookupList.Lookup: + if lookup.LookupType == 2: + compact_lookup(font, mode, lookup) + elif lookup.LookupType == 9 and lookup.SubTable[0].ExtensionLookupType == 2: + compact_ext_lookup(font, mode, lookup) + return font + + +def compact_lookup(font: TTFont, mode: str, lookup: otTables.Lookup) -> None: + new_subtables = compact_pair_pos(font, mode, lookup.SubTable) + lookup.SubTable = new_subtables + lookup.SubTableCount = len(new_subtables) + + +def compact_ext_lookup(font: TTFont, mode: str, lookup: otTables.Lookup) -> None: + new_subtables = compact_pair_pos( + font, mode, [ext_subtable.ExtSubTable for ext_subtable in lookup.SubTable] + ) + new_ext_subtables = [] + for subtable in new_subtables: + ext_subtable = otTables.ExtensionPos() + ext_subtable.Format = 1 + ext_subtable.ExtSubTable = subtable + new_ext_subtables.append(ext_subtable) + lookup.SubTable = new_ext_subtables + lookup.SubTableCount = len(new_ext_subtables) + + +def compact_pair_pos( + font: TTFont, mode: str, subtables: Sequence[otTables.PairPos] +) -> Sequence[otTables.PairPos]: + new_subtables = [] + for subtable in subtables: + if subtable.Format == 1: + # Not doing anything to Format 1 (yet?) + new_subtables.append(subtable) + elif subtable.Format == 2: + new_subtables.extend(compact_class_pairs(font, mode, subtable)) + return new_subtables + + +def compact_class_pairs( + font: TTFont, mode: str, subtable: otTables.PairPos +) -> List[otTables.PairPos]: + from fontTools.otlLib.builder import buildPairPosClassesSubtable + + subtables = [] + classes1: DefaultDict[int, List[str]] = defaultdict(list) + for g in subtable.Coverage.glyphs: + classes1[subtable.ClassDef1.classDefs.get(g, 0)].append(g) + classes2: DefaultDict[int, List[str]] = defaultdict(list) + for g, i in subtable.ClassDef2.classDefs.items(): + classes2[i].append(g) + all_pairs = {} + for i, class1 in enumerate(subtable.Class1Record): + for j, class2 in enumerate(class1.Class2Record): + if is_really_zero(class2): + continue + all_pairs[(tuple(sorted(classes1[i])), tuple(sorted(classes2[j])))] = ( + getattr(class2, "Value1", None), + getattr(class2, "Value2", None), + ) + + if len(mode) == 1 and mode in "123456789": + grouped_pairs = cluster_pairs_by_class2_coverage_custom_cost( + font, all_pairs, int(mode) + ) + for pairs in grouped_pairs: + subtables.append( + buildPairPosClassesSubtable(pairs, font.getReverseGlyphMap()) + ) + else: + raise ValueError(f"Bad {GPOS_COMPACT_MODE_ENV_KEY}={mode}") + return subtables + + +def is_really_zero(class2: otTables.Class2Record) -> bool: + v1 = getattr(class2, "Value1", None) + v2 = getattr(class2, "Value2", None) + return (v1 is None or v1.getEffectiveFormat() == 0) and ( + v2 is None or v2.getEffectiveFormat() == 0 + ) + + +Pairs = Dict[ + Tuple[Tuple[str, ...], Tuple[str, ...]], + Tuple[otBase.ValueRecord, otBase.ValueRecord], +] + +# Adapted from https://github.com/fonttools/fonttools/blob/f64f0b42f2d1163b2d85194e0979def539f5dca3/Lib/fontTools/ttLib/tables/otTables.py#L935-L958 +def _getClassRanges(glyphIDs: Iterable[int]): + glyphIDs = sorted(glyphIDs) + last = glyphIDs[0] + ranges = [[last]] + for glyphID in glyphIDs[1:]: + if glyphID != last + 1: + ranges[-1].append(last) + ranges.append([glyphID]) + last = glyphID + ranges[-1].append(last) + return ranges, glyphIDs[0], glyphIDs[-1] + + +# Adapted from https://github.com/fonttools/fonttools/blob/f64f0b42f2d1163b2d85194e0979def539f5dca3/Lib/fontTools/ttLib/tables/otTables.py#L960-L989 +def _classDef_bytes( + class_data: List[Tuple[List[Tuple[int, int]], int, int]], + class_ids: List[int], + coverage=False, +): + if not class_ids: + return 0 + first_ranges, min_glyph_id, max_glyph_id = class_data[class_ids[0]] + range_count = len(first_ranges) + for i in class_ids[1:]: + data = class_data[i] + range_count += len(data[0]) + min_glyph_id = min(min_glyph_id, data[1]) + max_glyph_id = max(max_glyph_id, data[2]) + glyphCount = max_glyph_id - min_glyph_id + 1 + # https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#class-definition-table-format-1 + format1_bytes = 6 + glyphCount * 2 + # https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#class-definition-table-format-2 + format2_bytes = 4 + range_count * 6 + return min(format1_bytes, format2_bytes) + + +ClusteringContext = namedtuple( + "ClusteringContext", + [ + "lines", + "all_class1", + "all_class1_data", + "all_class2_data", + "valueFormat1_bytes", + "valueFormat2_bytes", + ], +) + + +class Cluster: + # TODO(Python 3.7): Turn this into a dataclass + # ctx: ClusteringContext + # indices: int + # Caches + # TODO(Python 3.8): use functools.cached_property instead of the + # manually cached properties, and remove the cache fields listed below. + # _indices: Optional[List[int]] = None + # _column_indices: Optional[List[int]] = None + # _cost: Optional[int] = None + + __slots__ = "ctx", "indices_bitmask", "_indices", "_column_indices", "_cost" + + def __init__(self, ctx: ClusteringContext, indices_bitmask: int): + self.ctx = ctx + self.indices_bitmask = indices_bitmask + self._indices = None + self._column_indices = None + self._cost = None + + @property + def indices(self): + if self._indices is None: + self._indices = bit_indices(self.indices_bitmask) + return self._indices + + @property + def column_indices(self): + if self._column_indices is None: + # Indices of columns that have a 1 in at least 1 line + # => binary OR all the lines + bitmask = reduce(int.__or__, (self.ctx.lines[i] for i in self.indices)) + self._column_indices = bit_indices(bitmask) + return self._column_indices + + @property + def width(self): + # Add 1 because Class2=0 cannot be used but needs to be encoded. + return len(self.column_indices) + 1 + + @property + def cost(self): + if self._cost is None: + self._cost = ( + # 2 bytes to store the offset to this subtable in the Lookup table above + 2 + # Contents of the subtable + # From: https://docs.microsoft.com/en-us/typography/opentype/spec/gpos#pair-adjustment-positioning-format-2-class-pair-adjustment + # uint16 posFormat Format identifier: format = 2 + + 2 + # Offset16 coverageOffset Offset to Coverage table, from beginning of PairPos subtable. + + 2 + + self.coverage_bytes + # uint16 valueFormat1 ValueRecord definition — for the first glyph of the pair (may be zero). + + 2 + # uint16 valueFormat2 ValueRecord definition — for the second glyph of the pair (may be zero). + + 2 + # Offset16 classDef1Offset Offset to ClassDef table, from beginning of PairPos subtable — for the first glyph of the pair. + + 2 + + self.classDef1_bytes + # Offset16 classDef2Offset Offset to ClassDef table, from beginning of PairPos subtable — for the second glyph of the pair. + + 2 + + self.classDef2_bytes + # uint16 class1Count Number of classes in classDef1 table — includes Class 0. + + 2 + # uint16 class2Count Number of classes in classDef2 table — includes Class 0. + + 2 + # Class1Record class1Records[class1Count] Array of Class1 records, ordered by classes in classDef1. + + (self.ctx.valueFormat1_bytes + self.ctx.valueFormat2_bytes) + * len(self.indices) + * self.width + ) + return self._cost + + @property + def coverage_bytes(self): + format1_bytes = ( + # From https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#coverage-format-1 + # uint16 coverageFormat Format identifier — format = 1 + # uint16 glyphCount Number of glyphs in the glyph array + 4 + # uint16 glyphArray[glyphCount] Array of glyph IDs — in numerical order + + sum(len(self.ctx.all_class1[i]) for i in self.indices) * 2 + ) + ranges = sorted( + chain.from_iterable(self.ctx.all_class1_data[i][0] for i in self.indices) + ) + merged_range_count = 0 + last = None + for (start, end) in ranges: + if last is not None and start != last + 1: + merged_range_count += 1 + last = end + format2_bytes = ( + # From https://docs.microsoft.com/en-us/typography/opentype/spec/chapter2#coverage-format-2 + # uint16 coverageFormat Format identifier — format = 2 + # uint16 rangeCount Number of RangeRecords + 4 + # RangeRecord rangeRecords[rangeCount] Array of glyph ranges — ordered by startGlyphID. + # uint16 startGlyphID First glyph ID in the range + # uint16 endGlyphID Last glyph ID in the range + # uint16 startCoverageIndex Coverage Index of first glyph ID in range + + merged_range_count * 6 + ) + return min(format1_bytes, format2_bytes) + + @property + def classDef1_bytes(self): + # We can skip encoding one of the Class1 definitions, and use + # Class1=0 to represent it instead, because Class1 is gated by the + # Coverage definition. Use Class1=0 for the highest byte savings. + # Going through all options takes too long, pick the biggest class + # = what happens in otlLib.builder.ClassDefBuilder.classes() + biggest_index = max(self.indices, key=lambda i: len(self.ctx.all_class1[i])) + return _classDef_bytes( + self.ctx.all_class1_data, [i for i in self.indices if i != biggest_index] + ) + + @property + def classDef2_bytes(self): + # All Class2 need to be encoded because we can't use Class2=0 + return _classDef_bytes(self.ctx.all_class2_data, self.column_indices) + + +def cluster_pairs_by_class2_coverage_custom_cost( + font: TTFont, + pairs: Pairs, + compression: int = 5, +) -> List[Pairs]: + if not pairs: + # The subtable was actually empty? + return [pairs] + + # Sorted for reproducibility/determinism + all_class1 = sorted(set(pair[0] for pair in pairs)) + all_class2 = sorted(set(pair[1] for pair in pairs)) + + # Use Python's big ints for binary vectors representing each line + lines = [ + sum( + 1 << i if (class1, class2) in pairs else 0 + for i, class2 in enumerate(all_class2) + ) + for class1 in all_class1 + ] + + # Map glyph names to ids and work with ints throughout for ClassDef formats + name_to_id = font.getReverseGlyphMap() + # Each entry in the arrays below is (range_count, min_glyph_id, max_glyph_id) + all_class1_data = [ + _getClassRanges(name_to_id[name] for name in cls) for cls in all_class1 + ] + all_class2_data = [ + _getClassRanges(name_to_id[name] for name in cls) for cls in all_class2 + ] + + format1 = 0 + format2 = 0 + for pair, value in pairs.items(): + format1 |= value[0].getEffectiveFormat() if value[0] else 0 + format2 |= value[1].getEffectiveFormat() if value[1] else 0 + valueFormat1_bytes = bit_count(format1) * 2 + valueFormat2_bytes = bit_count(format2) * 2 + + ctx = ClusteringContext( + lines, + all_class1, + all_class1_data, + all_class2_data, + valueFormat1_bytes, + valueFormat2_bytes, + ) + + cluster_cache: Dict[int, Cluster] = {} + + def make_cluster(indices: int) -> Cluster: + cluster = cluster_cache.get(indices, None) + if cluster is not None: + return cluster + cluster = Cluster(ctx, indices) + cluster_cache[indices] = cluster + return cluster + + def merge(cluster: Cluster, other: Cluster) -> Cluster: + return make_cluster(cluster.indices_bitmask | other.indices_bitmask) + + # Agglomerative clustering by hand, checking the cost gain of the new + # cluster against the previously separate clusters + # Start with 1 cluster per line + # cluster = set of lines = new subtable + clusters = [make_cluster(1 << i) for i in range(len(lines))] + + # Cost of 1 cluster with everything + # `(1 << len) - 1` gives a bitmask full of 1's of length `len` + cost_before_splitting = make_cluster((1 << len(lines)) - 1).cost + log.debug(f" len(clusters) = {len(clusters)}") + + while len(clusters) > 1: + lowest_cost_change = None + best_cluster_index = None + best_other_index = None + best_merged = None + for i, cluster in enumerate(clusters): + for j, other in enumerate(clusters[i + 1 :]): + merged = merge(cluster, other) + cost_change = merged.cost - cluster.cost - other.cost + if lowest_cost_change is None or cost_change < lowest_cost_change: + lowest_cost_change = cost_change + best_cluster_index = i + best_other_index = i + 1 + j + best_merged = merged + assert lowest_cost_change is not None + assert best_cluster_index is not None + assert best_other_index is not None + assert best_merged is not None + + # If the best merge we found is still taking down the file size, then + # there's no question: we must do it, because it's beneficial in both + # ways (lower file size and lower number of subtables). However, if the + # best merge we found is not reducing file size anymore, then we need to + # look at the other stop criteria = the compression factor. + if lowest_cost_change > 0: + # Stop critera: check whether we should keep merging. + # Compute size reduction brought by splitting + cost_after_splitting = sum(c.cost for c in clusters) + # size_reduction so that after = before * (1 - size_reduction) + # E.g. before = 1000, after = 800, 1 - 800/1000 = 0.2 + size_reduction = 1 - cost_after_splitting / cost_before_splitting + + # Force more merging by taking into account the compression number. + # Target behaviour: compression number = 1 to 9, default 5 like gzip + # - 1 = accept to add 1 subtable to reduce size by 50% + # - 5 = accept to add 5 subtables to reduce size by 50% + # See https://github.com/harfbuzz/packtab/blob/master/Lib/packTab/__init__.py#L690-L691 + # Given the size reduction we have achieved so far, compute how many + # new subtables are acceptable. + max_new_subtables = -log2(1 - size_reduction) * compression + log.debug( + f" len(clusters) = {len(clusters):3d} size_reduction={size_reduction:5.2f} max_new_subtables={max_new_subtables}", + ) + if compression == 9: + # Override level 9 to mean: create any number of subtables + max_new_subtables = len(clusters) + + # If we have managed to take the number of new subtables below the + # threshold, then we can stop. + if len(clusters) <= max_new_subtables + 1: + break + + # No reason to stop yet, do the merge and move on to the next. + del clusters[best_other_index] + clusters[best_cluster_index] = best_merged + + # All clusters are final; turn bitmasks back into the "Pairs" format + pairs_by_class1: Dict[Tuple[str, ...], Pairs] = defaultdict(dict) + for pair, values in pairs.items(): + pairs_by_class1[pair[0]][pair] = values + pairs_groups: List[Pairs] = [] + for cluster in clusters: + pairs_group: Pairs = dict() + for i in cluster.indices: + class1 = all_class1[i] + pairs_group.update(pairs_by_class1[class1]) + pairs_groups.append(pairs_group) + return pairs_groups diff --git a/Lib/fontTools/pens/basePen.py b/Lib/fontTools/pens/basePen.py index 2161e021..e06c00ef 100644 --- a/Lib/fontTools/pens/basePen.py +++ b/Lib/fontTools/pens/basePen.py @@ -8,7 +8,7 @@ it is an abstraction for drawing outlines, making sure that outline objects don't need to know the details about how and where they're being drawn, and that drawings don't need to know the details of how outlines are stored. -The most basic pattern is this: +The most basic pattern is this:: outline.draw(pen) # 'outline' draws itself onto 'pen' @@ -21,13 +21,13 @@ The AbstractPen class defines the Pen protocol. It implements almost nothing (only no-op closePath() and endPath() methods), but is useful for documentation purposes. Subclassing it basically tells the reader: "this class implements the Pen protocol.". An examples of an AbstractPen -subclass is fontTools.pens.transformPen.TransformPen. +subclass is :py:class:`fontTools.pens.transformPen.TransformPen`. The BasePen class is a base implementation useful for pens that actually draw (for example a pen renders outlines using a native graphics engine). BasePen contains a lot of base functionality, making it very easy to build a pen that fully conforms to the pen protocol. Note that if you subclass -BasePen, you _don't_ override moveTo(), lineTo(), etc., but _moveTo(), +BasePen, you *don't* override moveTo(), lineTo(), etc., but _moveTo(), _lineTo(), etc. See the BasePen doc string for details. Examples of BasePen subclasses are fontTools.pens.boundsPen.BoundsPen and fontTools.pens.cocoaPen.CocoaPen. @@ -40,10 +40,14 @@ from typing import Tuple from fontTools.misc.loggingTools import LogMixin -__all__ = ["AbstractPen", "NullPen", "BasePen", +__all__ = ["AbstractPen", "NullPen", "BasePen", "PenError", "decomposeSuperBezierSegment", "decomposeQuadraticSegment"] +class PenError(Exception): + """Represents an error during penning.""" + + class AbstractPen: def moveTo(self, pt: Tuple[float, float]) -> None: @@ -147,7 +151,7 @@ class NullPen(AbstractPen): class LoggingPen(LogMixin, AbstractPen): - """A pen with a `log` property (see fontTools.misc.loggingTools.LogMixin) + """A pen with a ``log`` property (see fontTools.misc.loggingTools.LogMixin) """ pass diff --git a/Lib/fontTools/pens/boundsPen.py b/Lib/fontTools/pens/boundsPen.py index 810715ca..227c22f5 100644 --- a/Lib/fontTools/pens/boundsPen.py +++ b/Lib/fontTools/pens/boundsPen.py @@ -14,10 +14,11 @@ class ControlBoundsPen(BasePen): on their extremes. When the shape has been drawn, the bounds are available as the - 'bounds' attribute of the pen object. It's a 4-tuple: + ``bounds`` attribute of the pen object. It's a 4-tuple:: + (xMin, yMin, xMax, yMax). - If 'ignoreSinglePoints' is True, single points are ignored. + If ``ignoreSinglePoints`` is True, single points are ignored. """ def __init__(self, glyphSet, ignoreSinglePoints=False): @@ -73,7 +74,8 @@ class BoundsPen(ControlBoundsPen): than the "control bounds". When the shape has been drawn, the bounds are available as the - 'bounds' attribute of the pen object. It's a 4-tuple: + ``bounds`` attribute of the pen object. It's a 4-tuple:: + (xMin, yMin, xMax, yMax) """ diff --git a/Lib/fontTools/pens/cu2quPen.py b/Lib/fontTools/pens/cu2quPen.py index 497585bc..3c4ceae9 100644 --- a/Lib/fontTools/pens/cu2quPen.py +++ b/Lib/fontTools/pens/cu2quPen.py @@ -23,13 +23,15 @@ class Cu2QuPen(AbstractPen): """ A filter pen to convert cubic bezier curves to quadratic b-splines using the FontTools SegmentPen protocol. - other_pen: another SegmentPen used to draw the transformed outline. - max_err: maximum approximation error in font units. For optimal results, - if you know the UPEM of the font, we recommend setting this to a - value equal, or close to UPEM / 1000. - reverse_direction: flip the contours' direction but keep starting point. - stats: a dictionary counting the point numbers of quadratic segments. - ignore_single_points: don't emit contours containing only a single point + Args: + + other_pen: another SegmentPen used to draw the transformed outline. + max_err: maximum approximation error in font units. For optimal results, + if you know the UPEM of the font, we recommend setting this to a + value equal, or close to UPEM / 1000. + reverse_direction: flip the contours' direction but keep starting point. + stats: a dictionary counting the point numbers of quadratic segments. + ignore_single_points: don't emit contours containing only a single point NOTE: The "ignore_single_points" argument is deprecated since v1.3.0, which dropped Robofab subpport. It's no longer needed to special-case @@ -138,12 +140,13 @@ class Cu2QuPointPen(BasePointToSegmentPen): """ A filter pen to convert cubic bezier curves to quadratic b-splines using the RoboFab PointPen protocol. - other_point_pen: another PointPen used to draw the transformed outline. - max_err: maximum approximation error in font units. For optimal results, - if you know the UPEM of the font, we recommend setting this to a - value equal, or close to UPEM / 1000. - reverse_direction: reverse the winding direction of all contours. - stats: a dictionary counting the point numbers of quadratic segments. + Args: + other_point_pen: another PointPen used to draw the transformed outline. + max_err: maximum approximation error in font units. For optimal results, + if you know the UPEM of the font, we recommend setting this to a + value equal, or close to UPEM / 1000. + reverse_direction: reverse the winding direction of all contours. + stats: a dictionary counting the point numbers of quadratic segments. """ def __init__(self, other_point_pen, max_err, reverse_direction=False, diff --git a/Lib/fontTools/pens/freetypePen.py b/Lib/fontTools/pens/freetypePen.py new file mode 100644 index 00000000..870776bc --- /dev/null +++ b/Lib/fontTools/pens/freetypePen.py @@ -0,0 +1,458 @@ +# -*- coding: utf-8 -*- + +"""Pen to rasterize paths with FreeType.""" + +__all__ = ["FreeTypePen"] + +import os +import ctypes +import platform +import subprocess +import collections +import math + +import freetype +from freetype.raw import FT_Outline_Get_Bitmap, FT_Outline_Get_BBox, FT_Outline_Get_CBox +from freetype.ft_types import FT_Pos +from freetype.ft_structs import FT_Vector, FT_BBox, FT_Bitmap, FT_Outline +from freetype.ft_enums import ( + FT_OUTLINE_NONE, + FT_OUTLINE_EVEN_ODD_FILL, + FT_PIXEL_MODE_GRAY, + FT_CURVE_TAG_ON, + FT_CURVE_TAG_CONIC, + FT_CURVE_TAG_CUBIC, +) +from freetype.ft_errors import FT_Exception + +from fontTools.pens.basePen import BasePen, PenError +from fontTools.misc.roundTools import otRound +from fontTools.misc.transform import Transform + +Contour = collections.namedtuple("Contour", ("points", "tags")) + + +class FreeTypePen(BasePen): + """Pen to rasterize paths with FreeType. Requires `freetype-py` module. + + Constructs ``FT_Outline`` from the paths, and renders it within a bitmap + buffer. + + For ``array()`` and ``show()``, `numpy` and `matplotlib` must be installed. + For ``image()``, `Pillow` is required. Each module is lazily loaded when the + corresponding method is called. + + Args: + glyphSet: a dictionary of drawable glyph objects keyed by name + used to resolve component references in composite glyphs. + + :Examples: + If `numpy` and `matplotlib` is available, the following code will + show the glyph image of `fi` in a new window:: + + from fontTools.ttLib import TTFont + from fontTools.pens.freetypePen import FreeTypePen + from fontTools.misc.transform import Offset + pen = FreeTypePen(None) + font = TTFont('SourceSansPro-Regular.otf') + glyph = font.getGlyphSet()['fi'] + glyph.draw(pen) + width, ascender, descender = glyph.width, font['OS/2'].usWinAscent, -font['OS/2'].usWinDescent + height = ascender - descender + pen.show(width=width, height=height, transform=Offset(0, -descender)) + + Combining with `uharfbuzz`, you can typeset a chunk of glyphs in a pen:: + + import uharfbuzz as hb + from fontTools.pens.freetypePen import FreeTypePen + from fontTools.pens.transformPen import TransformPen + from fontTools.misc.transform import Offset + + en1, en2, ar, ja = 'Typesetting', 'Jeff', 'صف الحروف', 'たいぷせっと' + for text, font_path, direction, typo_ascender, typo_descender, vhea_ascender, vhea_descender, contain, features in ( + (en1, 'NotoSans-Regular.ttf', 'ltr', 2189, -600, None, None, False, {"kern": True, "liga": True}), + (en2, 'NotoSans-Regular.ttf', 'ltr', 2189, -600, None, None, True, {"kern": True, "liga": True}), + (ar, 'NotoSansArabic-Regular.ttf', 'rtl', 1374, -738, None, None, False, {"kern": True, "liga": True}), + (ja, 'NotoSansJP-Regular.otf', 'ltr', 880, -120, 500, -500, False, {"palt": True, "kern": True}), + (ja, 'NotoSansJP-Regular.otf', 'ttb', 880, -120, 500, -500, False, {"vert": True, "vpal": True, "vkrn": True}) + ): + blob = hb.Blob.from_file_path(font_path) + face = hb.Face(blob) + font = hb.Font(face) + buf = hb.Buffer() + buf.direction = direction + buf.add_str(text) + buf.guess_segment_properties() + hb.shape(font, buf, features) + + x, y = 0, 0 + pen = FreeTypePen(None) + for info, pos in zip(buf.glyph_infos, buf.glyph_positions): + gid = info.codepoint + transformed = TransformPen(pen, Offset(x + pos.x_offset, y + pos.y_offset)) + font.draw_glyph_with_pen(gid, transformed) + x += pos.x_advance + y += pos.y_advance + + offset, width, height = None, None, None + if direction in ('ltr', 'rtl'): + offset = (0, -typo_descender) + width = x + height = typo_ascender - typo_descender + else: + offset = (-vhea_descender, -y) + width = vhea_ascender - vhea_descender + height = -y + pen.show(width=width, height=height, transform=Offset(*offset), contain=contain) + + For Jupyter Notebook, the rendered image will be displayed in a cell if + you replace ``show()`` with ``image()`` in the examples. + """ + + def __init__(self, glyphSet): + BasePen.__init__(self, glyphSet) + self.contours = [] + + def outline(self, transform=None, evenOdd=False): + """Converts the current contours to ``FT_Outline``. + + Args: + transform: An optional 6-tuple containing an affine transformation, + or a ``Transform`` object from the ``fontTools.misc.transform`` + module. + evenOdd: Pass ``True`` for even-odd fill instead of non-zero. + """ + transform = transform or Transform() + if not hasattr(transform, "transformPoint"): + transform = Transform(*transform) + n_contours = len(self.contours) + n_points = sum((len(contour.points) for contour in self.contours)) + points = [] + for contour in self.contours: + for point in contour.points: + point = transform.transformPoint(point) + points.append( + FT_Vector( + FT_Pos(otRound(point[0] * 64)), FT_Pos(otRound(point[1] * 64)) + ) + ) + tags = [] + for contour in self.contours: + for tag in contour.tags: + tags.append(tag) + contours = [] + contours_sum = 0 + for contour in self.contours: + contours_sum += len(contour.points) + contours.append(contours_sum - 1) + flags = FT_OUTLINE_EVEN_ODD_FILL if evenOdd else FT_OUTLINE_NONE + return FT_Outline( + (ctypes.c_short)(n_contours), + (ctypes.c_short)(n_points), + (FT_Vector * n_points)(*points), + (ctypes.c_ubyte * n_points)(*tags), + (ctypes.c_short * n_contours)(*contours), + (ctypes.c_int)(flags), + ) + + def buffer( + self, width=None, height=None, transform=None, contain=False, evenOdd=False + ): + """Renders the current contours within a bitmap buffer. + + Args: + width: Image width of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + height: Image height of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + transform: An optional 6-tuple containing an affine transformation, + or a ``Transform`` object from the ``fontTools.misc.transform`` + module. The bitmap size is not affected by this matrix. + contain: If ``True``, the image size will be automatically expanded + so that it fits to the bounding box of the paths. Useful for + rendering glyphs with negative sidebearings without clipping. + evenOdd: Pass ``True`` for even-odd fill instead of non-zero. + + Returns: + A tuple of ``(buffer, size)``, where ``buffer`` is a ``bytes`` + object of the resulted bitmap and ``size`` is a 2-tuple of its + dimension. + + :Notes: + The image size should always be given explicitly if you need to get + a proper glyph image. When ``width`` and ``height`` are omitted, it + forcifully fits to the bounding box and the side bearings get + cropped. If you pass ``0`` to both ``width`` and ``height`` and set + ``contain`` to ``True``, it expands to the bounding box while + maintaining the origin of the contours, meaning that LSB will be + maintained but RSB won’t. The difference between the two becomes + more obvious when rotate or skew transformation is applied. + + :Example: + .. code-block:: + + >> pen = FreeTypePen(None) + >> glyph.draw(pen) + >> buf, size = pen.buffer(width=500, height=1000) + >> type(buf), len(buf), size + (, 500000, (500, 1000)) + + """ + transform = transform or Transform() + if not hasattr(transform, "transformPoint"): + transform = Transform(*transform) + contain_x, contain_y = contain or width is None, contain or height is None + if contain_x or contain_y: + dx, dy = transform.dx, transform.dy + bbox = self.bbox + p1, p2, p3, p4 = ( + transform.transformPoint((bbox[0], bbox[1])), + transform.transformPoint((bbox[2], bbox[1])), + transform.transformPoint((bbox[0], bbox[3])), + transform.transformPoint((bbox[2], bbox[3])), + ) + px, py = (p1[0], p2[0], p3[0], p4[0]), (p1[1], p2[1], p3[1], p4[1]) + if contain_x: + if width is None: + dx = dx - min(*px) + width = max(*px) - min(*px) + else: + dx = dx - min(min(*px), 0.0) + width = max(width, max(*px) - min(min(*px), 0.0)) + if contain_y: + if height is None: + dy = dy - min(*py) + height = max(*py) - min(*py) + else: + dy = dy - min(min(*py), 0.0) + height = max(height, max(*py) - min(min(*py), 0.0)) + transform = Transform(*transform[:4], dx, dy) + width, height = math.ceil(width), math.ceil(height) + buf = ctypes.create_string_buffer(width * height) + bitmap = FT_Bitmap( + (ctypes.c_int)(height), + (ctypes.c_int)(width), + (ctypes.c_int)(width), + (ctypes.POINTER(ctypes.c_ubyte))(buf), + (ctypes.c_short)(256), + (ctypes.c_ubyte)(FT_PIXEL_MODE_GRAY), + (ctypes.c_char)(0), + (ctypes.c_void_p)(None), + ) + outline = self.outline(transform=transform, evenOdd=evenOdd) + err = FT_Outline_Get_Bitmap( + freetype.get_handle(), ctypes.byref(outline), ctypes.byref(bitmap) + ) + if err != 0: + raise FT_Exception(err) + return buf.raw, (width, height) + + def array( + self, width=None, height=None, transform=None, contain=False, evenOdd=False + ): + """Returns the rendered contours as a numpy array. Requires `numpy`. + + Args: + width: Image width of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + height: Image height of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + transform: An optional 6-tuple containing an affine transformation, + or a ``Transform`` object from the ``fontTools.misc.transform`` + module. The bitmap size is not affected by this matrix. + contain: If ``True``, the image size will be automatically expanded + so that it fits to the bounding box of the paths. Useful for + rendering glyphs with negative sidebearings without clipping. + evenOdd: Pass ``True`` for even-odd fill instead of non-zero. + + Returns: + A ``numpy.ndarray`` object with a shape of ``(height, width)``. + Each element takes a value in the range of ``[0.0, 1.0]``. + + :Notes: + The image size should always be given explicitly if you need to get + a proper glyph image. When ``width`` and ``height`` are omitted, it + forcifully fits to the bounding box and the side bearings get + cropped. If you pass ``0`` to both ``width`` and ``height`` and set + ``contain`` to ``True``, it expands to the bounding box while + maintaining the origin of the contours, meaning that LSB will be + maintained but RSB won’t. The difference between the two becomes + more obvious when rotate or skew transformation is applied. + + :Example: + .. code-block:: + + >> pen = FreeTypePen(None) + >> glyph.draw(pen) + >> arr = pen.array(width=500, height=1000) + >> type(a), a.shape + (, (1000, 500)) + """ + import numpy as np + + buf, size = self.buffer( + width=width, + height=height, + transform=transform, + contain=contain, + evenOdd=evenOdd, + ) + return np.frombuffer(buf, "B").reshape((size[1], size[0])) / 255.0 + + def show( + self, width=None, height=None, transform=None, contain=False, evenOdd=False + ): + """Plots the rendered contours with `pyplot`. Requires `numpy` and + `matplotlib`. + + Args: + width: Image width of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + height: Image height of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + transform: An optional 6-tuple containing an affine transformation, + or a ``Transform`` object from the ``fontTools.misc.transform`` + module. The bitmap size is not affected by this matrix. + contain: If ``True``, the image size will be automatically expanded + so that it fits to the bounding box of the paths. Useful for + rendering glyphs with negative sidebearings without clipping. + evenOdd: Pass ``True`` for even-odd fill instead of non-zero. + + :Notes: + The image size should always be given explicitly if you need to get + a proper glyph image. When ``width`` and ``height`` are omitted, it + forcifully fits to the bounding box and the side bearings get + cropped. If you pass ``0`` to both ``width`` and ``height`` and set + ``contain`` to ``True``, it expands to the bounding box while + maintaining the origin of the contours, meaning that LSB will be + maintained but RSB won’t. The difference between the two becomes + more obvious when rotate or skew transformation is applied. + + :Example: + .. code-block:: + + >> pen = FreeTypePen(None) + >> glyph.draw(pen) + >> pen.show(width=500, height=1000) + """ + from matplotlib import pyplot as plt + + a = self.array( + width=width, + height=height, + transform=transform, + contain=contain, + evenOdd=evenOdd, + ) + plt.imshow(a, cmap="gray_r", vmin=0, vmax=1) + plt.show() + + def image( + self, width=None, height=None, transform=None, contain=False, evenOdd=False + ): + """Returns the rendered contours as a PIL image. Requires `Pillow`. + Can be used to display a glyph image in Jupyter Notebook. + + Args: + width: Image width of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + height: Image height of the bitmap in pixels. If omitted, it + automatically fits to the bounding box of the contours. + transform: An optional 6-tuple containing an affine transformation, + or a ``Transform`` object from the ``fontTools.misc.transform`` + module. The bitmap size is not affected by this matrix. + contain: If ``True``, the image size will be automatically expanded + so that it fits to the bounding box of the paths. Useful for + rendering glyphs with negative sidebearings without clipping. + evenOdd: Pass ``True`` for even-odd fill instead of non-zero. + + Returns: + A ``PIL.image`` object. The image is filled in black with alpha + channel obtained from the rendered bitmap. + + :Notes: + The image size should always be given explicitly if you need to get + a proper glyph image. When ``width`` and ``height`` are omitted, it + forcifully fits to the bounding box and the side bearings get + cropped. If you pass ``0`` to both ``width`` and ``height`` and set + ``contain`` to ``True``, it expands to the bounding box while + maintaining the origin of the contours, meaning that LSB will be + maintained but RSB won’t. The difference between the two becomes + more obvious when rotate or skew transformation is applied. + + :Example: + .. code-block:: + + >> pen = FreeTypePen(None) + >> glyph.draw(pen) + >> img = pen.image(width=500, height=1000) + >> type(img), img.size + (, (500, 1000)) + """ + from PIL import Image + + buf, size = self.buffer( + width=width, + height=height, + transform=transform, + contain=contain, + evenOdd=evenOdd, + ) + img = Image.new("L", size, 0) + img.putalpha(Image.frombuffer("L", size, buf)) + return img + + @property + def bbox(self): + """Computes the exact bounding box of an outline. + + Returns: + A tuple of ``(xMin, yMin, xMax, yMax)``. + """ + bbox = FT_BBox() + outline = self.outline() + FT_Outline_Get_BBox(ctypes.byref(outline), ctypes.byref(bbox)) + return (bbox.xMin / 64.0, bbox.yMin / 64.0, bbox.xMax / 64.0, bbox.yMax / 64.0) + + @property + def cbox(self): + """Returns an outline's ‘control box’. + + Returns: + A tuple of ``(xMin, yMin, xMax, yMax)``. + """ + cbox = FT_BBox() + outline = self.outline() + FT_Outline_Get_CBox(ctypes.byref(outline), ctypes.byref(cbox)) + return (cbox.xMin / 64.0, cbox.yMin / 64.0, cbox.xMax / 64.0, cbox.yMax / 64.0) + + def _moveTo(self, pt): + contour = Contour([], []) + self.contours.append(contour) + contour.points.append(pt) + contour.tags.append(FT_CURVE_TAG_ON) + + def _lineTo(self, pt): + if not (self.contours and len(self.contours[-1].points) > 0): + raise PenError("Contour missing required initial moveTo") + contour = self.contours[-1] + contour.points.append(pt) + contour.tags.append(FT_CURVE_TAG_ON) + + def _curveToOne(self, p1, p2, p3): + if not (self.contours and len(self.contours[-1].points) > 0): + raise PenError("Contour missing required initial moveTo") + t1, t2, t3 = FT_CURVE_TAG_CUBIC, FT_CURVE_TAG_CUBIC, FT_CURVE_TAG_ON + contour = self.contours[-1] + for p, t in ((p1, t1), (p2, t2), (p3, t3)): + contour.points.append(p) + contour.tags.append(t) + + def _qCurveToOne(self, p1, p2): + if not (self.contours and len(self.contours[-1].points) > 0): + raise PenError("Contour missing required initial moveTo") + t1, t2 = FT_CURVE_TAG_CONIC, FT_CURVE_TAG_ON + contour = self.contours[-1] + for p, t in ((p1, t1), (p2, t2)): + contour.points.append(p) + contour.tags.append(t) diff --git a/Lib/fontTools/pens/pointPen.py b/Lib/fontTools/pens/pointPen.py index 26f99d41..4c3148bf 100644 --- a/Lib/fontTools/pens/pointPen.py +++ b/Lib/fontTools/pens/pointPen.py @@ -15,7 +15,7 @@ For instance, whether or not a point is smooth, and its name. import math from typing import Any, Optional, Tuple -from fontTools.pens.basePen import AbstractPen +from fontTools.pens.basePen import AbstractPen, PenError __all__ = [ "AbstractPointPen", @@ -74,7 +74,8 @@ class BasePointToSegmentPen(AbstractPointPen): self.currentPath = None def beginPath(self, identifier=None, **kwargs): - assert self.currentPath is None + if self.currentPath is not None: + raise PenError("Path already begun.") self.currentPath = [] def _flushContour(self, segments): @@ -106,7 +107,8 @@ class BasePointToSegmentPen(AbstractPointPen): raise NotImplementedError def endPath(self): - assert self.currentPath is not None + if self.currentPath is None: + raise PenError("Path not begun.") points = self.currentPath self.currentPath = None if not points: @@ -154,6 +156,8 @@ class BasePointToSegmentPen(AbstractPointPen): def addPoint(self, pt, segmentType=None, smooth=False, name=None, identifier=None, **kwargs): + if self.currentPath is None: + raise PenError("Path not begun") self.currentPath.append((pt, segmentType, smooth, name, kwargs)) @@ -161,6 +165,9 @@ class PointToSegmentPen(BasePointToSegmentPen): """ Adapter class that converts the PointPen protocol to the (Segment)Pen protocol. + + NOTE: The segment pen does not support and will drop point names, identifiers + and kwargs. """ def __init__(self, segmentPen, outputImpliedClosingLine=False): @@ -169,21 +176,23 @@ class PointToSegmentPen(BasePointToSegmentPen): self.outputImpliedClosingLine = outputImpliedClosingLine def _flushContour(self, segments): - assert len(segments) >= 1 + if not segments: + raise PenError("Must have at least one segment.") pen = self.pen if segments[0][0] == "move": # It's an open path. closed = False points = segments[0][1] - assert len(points) == 1, "illegal move segment point count: %d" % len(points) - movePt, smooth, name, kwargs = points[0] + if len(points) != 1: + raise PenError(f"Illegal move segment point count: {len(points)}") + movePt, _, _ , _ = points[0] del segments[0] else: # It's a closed path, do a moveTo to the last # point of the last segment. closed = True segmentType, points = segments[-1] - movePt, smooth, name, kwargs = points[-1] + movePt, _, _ , _ = points[-1] if movePt is None: # quad special case: a contour with no on-curve points contains # one "qcurve" segment that ends with a point that's None. We @@ -196,9 +205,10 @@ class PointToSegmentPen(BasePointToSegmentPen): lastPt = movePt for i in range(nSegments): segmentType, points = segments[i] - points = [pt for pt, smooth, name, kwargs in points] + points = [pt for pt, _, _ , _ in points] if segmentType == "line": - assert len(points) == 1, "illegal line segment point count: %d" % len(points) + if len(points) != 1: + raise PenError(f"Illegal line segment point count: {len(points)}") pt = points[0] # For closed contours, a 'lineTo' is always implied from the last oncurve # point to the starting point, thus we can omit it when the last and @@ -224,7 +234,7 @@ class PointToSegmentPen(BasePointToSegmentPen): pen.qCurveTo(*points) lastPt = points[-1] else: - assert 0, "illegal segmentType: %s" % segmentType + raise PenError(f"Illegal segmentType: {segmentType}") if closed: pen.closePath() else: @@ -232,6 +242,7 @@ class PointToSegmentPen(BasePointToSegmentPen): def addComponent(self, glyphName, transform, identifier=None, **kwargs): del identifier # unused + del kwargs # unused self.pen.addComponent(glyphName, transform) @@ -260,27 +271,35 @@ class SegmentToPointPen(AbstractPen): self.contour.append((pt, "move")) def lineTo(self, pt): - assert self.contour is not None, "contour missing required initial moveTo" + if self.contour is None: + raise PenError("Contour missing required initial moveTo") self.contour.append((pt, "line")) def curveTo(self, *pts): - assert self.contour is not None, "contour missing required initial moveTo" + if not pts: + raise TypeError("Must pass in at least one point") + if self.contour is None: + raise PenError("Contour missing required initial moveTo") for pt in pts[:-1]: self.contour.append((pt, None)) self.contour.append((pts[-1], "curve")) def qCurveTo(self, *pts): + if not pts: + raise TypeError("Must pass in at least one point") if pts[-1] is None: self.contour = [] else: - assert self.contour is not None, "contour missing required initial moveTo" + if self.contour is None: + raise PenError("Contour missing required initial moveTo") for pt in pts[:-1]: self.contour.append((pt, None)) if pts[-1] is not None: self.contour.append((pts[-1], "qcurve")) def closePath(self): - assert self.contour is not None, "contour missing required initial moveTo" + if self.contour is None: + raise PenError("Contour missing required initial moveTo") if len(self.contour) > 1 and self.contour[0][0] == self.contour[-1][0]: self.contour[0] = self.contour[-1] del self.contour[-1] @@ -294,12 +313,14 @@ class SegmentToPointPen(AbstractPen): self.contour = None def endPath(self): - assert self.contour is not None, "contour missing required initial moveTo" + if self.contour is None: + raise PenError("Contour missing required initial moveTo") self._flushContour() self.contour = None def addComponent(self, glyphName, transform): - assert self.contour is None + if self.contour is not None: + raise PenError("Components must be added before or after contours") self.pen.addComponent(glyphName, transform) @@ -309,11 +330,14 @@ class GuessSmoothPointPen(AbstractPointPen): should be "smooth", ie. that it's a "tangent" point or a "curve" point. """ - def __init__(self, outPen): + def __init__(self, outPen, error=0.05): self._outPen = outPen + self._error = error self._points = None def _flushContour(self): + if self._points is None: + raise PenError("Path not begun") points = self._points nPoints = len(points) if not nPoints: @@ -329,7 +353,7 @@ class GuessSmoothPointPen(AbstractPointPen): # closed path containing 1 point (!), ignore. indices = [] for i in indices: - pt, segmentType, dummy, name, kwargs = points[i] + pt, segmentType, _, name, kwargs = points[i] if segmentType is None: continue prev = i - 1 @@ -343,16 +367,17 @@ class GuessSmoothPointPen(AbstractPointPen): if pt != prevPt and pt != nextPt: dx1, dy1 = pt[0] - prevPt[0], pt[1] - prevPt[1] dx2, dy2 = nextPt[0] - pt[0], nextPt[1] - pt[1] - a1 = math.atan2(dx1, dy1) - a2 = math.atan2(dx2, dy2) - if abs(a1 - a2) < 0.05: + a1 = math.atan2(dy1, dx1) + a2 = math.atan2(dy2, dx2) + if abs(a1 - a2) < self._error: points[i] = pt, segmentType, True, name, kwargs for pt, segmentType, smooth, name, kwargs in points: self._outPen.addPoint(pt, segmentType, smooth, name, **kwargs) def beginPath(self, identifier=None, **kwargs): - assert self._points is None + if self._points is not None: + raise PenError("Path already begun") self._points = [] if identifier is not None: kwargs["identifier"] = identifier @@ -365,12 +390,15 @@ class GuessSmoothPointPen(AbstractPointPen): def addPoint(self, pt, segmentType=None, smooth=False, name=None, identifier=None, **kwargs): + if self._points is None: + raise PenError("Path not begun") if identifier is not None: kwargs["identifier"] = identifier self._points.append((pt, segmentType, False, name, kwargs)) def addComponent(self, glyphName, transformation, identifier=None, **kwargs): - assert self._points is None + if self._points is not None: + raise PenError("Components must be added before or after contours") if identifier is not None: kwargs["identifier"] = identifier self._outPen.addComponent(glyphName, transformation, **kwargs) @@ -440,19 +468,26 @@ class ReverseContourPointPen(AbstractPointPen): pen.endPath() def beginPath(self, identifier=None, **kwargs): - assert self.currentContour is None + if self.currentContour is not None: + raise PenError("Path already begun") self.currentContour = [] self.currentContourIdentifier = identifier self.onCurve = [] def endPath(self): - assert self.currentContour is not None + if self.currentContour is None: + raise PenError("Path not begun") self._flushContour() self.currentContour = None - def addPoint(self, pt, segmentType=None, smooth=False, name=None, **kwargs): + def addPoint(self, pt, segmentType=None, smooth=False, name=None, identifier=None, **kwargs): + if self.currentContour is None: + raise PenError("Path not begun") + if identifier is not None: + kwargs["identifier"] = identifier self.currentContour.append((pt, segmentType, smooth, name, kwargs)) def addComponent(self, glyphName, transform, identifier=None, **kwargs): - assert self.currentContour is None + if self.currentContour is not None: + raise PenError("Components must be added before or after contours") self.pen.addComponent(glyphName, transform, identifier=identifier, **kwargs) diff --git a/Lib/fontTools/pens/recordingPen.py b/Lib/fontTools/pens/recordingPen.py index 99e87e5a..70f05e83 100644 --- a/Lib/fontTools/pens/recordingPen.py +++ b/Lib/fontTools/pens/recordingPen.py @@ -29,21 +29,21 @@ class RecordingPen(AbstractPen): The recording can be accessed as pen.value; or replayed using pen.replay(otherPen). - Usage example: - ============== - from fontTools.ttLib import TTFont - from fontTools.pens.recordingPen import RecordingPen + :Example: - glyph_name = 'dollar' - font_path = 'MyFont.otf' + from fontTools.ttLib import TTFont + from fontTools.pens.recordingPen import RecordingPen - font = TTFont(font_path) - glyphset = font.getGlyphSet() - glyph = glyphset[glyph_name] + glyph_name = 'dollar' + font_path = 'MyFont.otf' - pen = RecordingPen() - glyph.draw(pen) - print(pen.value) + font = TTFont(font_path) + glyphset = font.getGlyphSet() + glyph = glyphset[glyph_name] + + pen = RecordingPen() + glyph.draw(pen) + print(pen.value) """ def __init__(self): @@ -72,23 +72,23 @@ class DecomposingRecordingPen(DecomposingPen, RecordingPen): The constructor takes a single 'glyphSet' positional argument, a dictionary of glyph objects (i.e. with a 'draw' method) keyed - by thir name. - - >>> class SimpleGlyph(object): - ... def draw(self, pen): - ... pen.moveTo((0, 0)) - ... pen.curveTo((1, 1), (2, 2), (3, 3)) - ... pen.closePath() - >>> class CompositeGlyph(object): - ... def draw(self, pen): - ... pen.addComponent('a', (1, 0, 0, 1, -1, 1)) - >>> glyphSet = {'a': SimpleGlyph(), 'b': CompositeGlyph()} - >>> for name, glyph in sorted(glyphSet.items()): - ... pen = DecomposingRecordingPen(glyphSet) - ... glyph.draw(pen) - ... print("{}: {}".format(name, pen.value)) - a: [('moveTo', ((0, 0),)), ('curveTo', ((1, 1), (2, 2), (3, 3))), ('closePath', ())] - b: [('moveTo', ((-1, 1),)), ('curveTo', ((0, 2), (1, 3), (2, 4))), ('closePath', ())] + by thir name:: + + >>> class SimpleGlyph(object): + ... def draw(self, pen): + ... pen.moveTo((0, 0)) + ... pen.curveTo((1, 1), (2, 2), (3, 3)) + ... pen.closePath() + >>> class CompositeGlyph(object): + ... def draw(self, pen): + ... pen.addComponent('a', (1, 0, 0, 1, -1, 1)) + >>> glyphSet = {'a': SimpleGlyph(), 'b': CompositeGlyph()} + >>> for name, glyph in sorted(glyphSet.items()): + ... pen = DecomposingRecordingPen(glyphSet) + ... glyph.draw(pen) + ... print("{}: {}".format(name, pen.value)) + a: [('moveTo', ((0, 0),)), ('curveTo', ((1, 1), (2, 2), (3, 3))), ('closePath', ())] + b: [('moveTo', ((-1, 1),)), ('curveTo', ((0, 2), (1, 3), (2, 4))), ('closePath', ())] """ # raises KeyError if base glyph is not found in glyphSet skipMissingComponents = False @@ -100,38 +100,44 @@ class RecordingPointPen(AbstractPointPen): The recording can be accessed as pen.value; or replayed using pointPen.replay(otherPointPen). - Usage example: - ============== - from defcon import Font - from fontTools.pens.recordingPen import RecordingPointPen + :Example: + + from defcon import Font + from fontTools.pens.recordingPen import RecordingPointPen - glyph_name = 'a' - font_path = 'MyFont.ufo' + glyph_name = 'a' + font_path = 'MyFont.ufo' - font = Font(font_path) - glyph = font[glyph_name] + font = Font(font_path) + glyph = font[glyph_name] - pen = RecordingPointPen() - glyph.drawPoints(pen) - print(pen.value) + pen = RecordingPointPen() + glyph.drawPoints(pen) + print(pen.value) - new_glyph = font.newGlyph('b') - pen.replay(new_glyph.getPointPen()) + new_glyph = font.newGlyph('b') + pen.replay(new_glyph.getPointPen()) """ def __init__(self): self.value = [] - def beginPath(self, **kwargs): + def beginPath(self, identifier=None, **kwargs): + if identifier is not None: + kwargs["identifier"] = identifier self.value.append(("beginPath", (), kwargs)) def endPath(self): self.value.append(("endPath", (), {})) - def addPoint(self, pt, segmentType=None, smooth=False, name=None, **kwargs): + def addPoint(self, pt, segmentType=None, smooth=False, name=None, identifier=None, **kwargs): + if identifier is not None: + kwargs["identifier"] = identifier self.value.append(("addPoint", (pt, segmentType, smooth, name), kwargs)) - def addComponent(self, baseGlyphName, transformation, **kwargs): + def addComponent(self, baseGlyphName, transformation, identifier=None, **kwargs): + if identifier is not None: + kwargs["identifier"] = identifier self.value.append(("addComponent", (baseGlyphName, transformation), kwargs)) def replay(self, pointPen): diff --git a/Lib/fontTools/pens/reportLabPen.py b/Lib/fontTools/pens/reportLabPen.py index c0a4610b..43217d42 100644 --- a/Lib/fontTools/pens/reportLabPen.py +++ b/Lib/fontTools/pens/reportLabPen.py @@ -7,7 +7,7 @@ __all__ = ["ReportLabPen"] class ReportLabPen(BasePen): - """A pen for drawing onto a reportlab.graphics.shapes.Path object.""" + """A pen for drawing onto a ``reportlab.graphics.shapes.Path`` object.""" def __init__(self, glyphSet, path=None): BasePen.__init__(self, glyphSet) diff --git a/Lib/fontTools/pens/svgPathPen.py b/Lib/fontTools/pens/svgPathPen.py index 4352ba47..e92737e3 100644 --- a/Lib/fontTools/pens/svgPathPen.py +++ b/Lib/fontTools/pens/svgPathPen.py @@ -1,18 +1,36 @@ +from typing import Callable from fontTools.pens.basePen import BasePen -def pointToString(pt): - return " ".join([str(i) for i in pt]) +def pointToString(pt, ntos=str): + return " ".join(ntos(i) for i in pt) class SVGPathPen(BasePen): + """ Pen to draw SVG path d commands. - def __init__(self, glyphSet): + Example:: + >>> pen = SVGPathPen(None) + >>> pen.moveTo((0, 0)) + >>> pen.lineTo((1, 1)) + >>> pen.curveTo((2, 2), (3, 3), (4, 4)) + >>> pen.closePath() + >>> pen.getCommands() + 'M0 0 1 1C2 2 3 3 4 4Z' + + Args: + glyphSet: a dictionary of drawable glyph objects keyed by name + used to resolve component references in composite glyphs. + ntos: a callable that takes a number and returns a string, to + customize how numbers are formatted (default: str). + """ + def __init__(self, glyphSet, ntos: Callable[[float], str] = str): BasePen.__init__(self, glyphSet) self._commands = [] self._lastCommand = None self._lastX = None self._lastY = None + self._ntos = ntos def _handleAnchor(self): """ @@ -43,7 +61,7 @@ class SVGPathPen(BasePen): ['M0 10'] """ self._handleAnchor() - t = "M%s" % (pointToString(pt)) + t = "M%s" % (pointToString(pt, self._ntos)) self._commands.append(t) self._lastCommand = "M" self._lastX, self._lastY = pt @@ -91,19 +109,19 @@ class SVGPathPen(BasePen): # vertical line elif x == self._lastX: cmd = "V" - pts = str(y) + pts = self._ntos(y) # horizontal line elif y == self._lastY: cmd = "H" - pts = str(x) + pts = self._ntos(x) # previous was a moveto elif self._lastCommand == "M": cmd = None - pts = " " + pointToString(pt) + pts = " " + pointToString(pt, self._ntos) # basic else: cmd = "L" - pts = pointToString(pt) + pts = pointToString(pt, self._ntos) # write the string t = "" if cmd: @@ -122,9 +140,9 @@ class SVGPathPen(BasePen): ['C10 20 30 40 50 60'] """ t = "C" - t += pointToString(pt1) + " " - t += pointToString(pt2) + " " - t += pointToString(pt3) + t += pointToString(pt1, self._ntos) + " " + t += pointToString(pt2, self._ntos) + " " + t += pointToString(pt3, self._ntos) self._commands.append(t) self._lastCommand = "C" self._lastX, self._lastY = pt3 @@ -135,11 +153,16 @@ class SVGPathPen(BasePen): >>> pen.qCurveTo((10, 20), (30, 40)) >>> pen._commands ['Q10 20 30 40'] + >>> from fontTools.misc.roundTools import otRound + >>> pen = SVGPathPen(None, ntos=lambda v: str(otRound(v))) + >>> pen.qCurveTo((3, 3), (7, 5), (11, 4)) + >>> pen._commands + ['Q3 3 5 4', 'Q7 5 11 4'] """ assert pt2 is not None t = "Q" - t += pointToString(pt1) + " " - t += pointToString(pt2) + t += pointToString(pt1, self._ntos) + " " + t += pointToString(pt2, self._ntos) self._commands.append(t) self._lastCommand = "Q" self._lastX, self._lastY = pt2 diff --git a/Lib/fontTools/pens/transformPen.py b/Lib/fontTools/pens/transformPen.py index 2dcf83b1..93d19191 100644 --- a/Lib/fontTools/pens/transformPen.py +++ b/Lib/fontTools/pens/transformPen.py @@ -1,7 +1,7 @@ from fontTools.pens.filterPen import FilterPen, FilterPointPen -__all__ = ["TransformPen"] +__all__ = ["TransformPen", "TransformPointPen"] class TransformPen(FilterPen): diff --git a/Lib/fontTools/pens/ttGlyphPen.py b/Lib/fontTools/pens/ttGlyphPen.py index e7841efc..5087e158 100644 --- a/Lib/fontTools/pens/ttGlyphPen.py +++ b/Lib/fontTools/pens/ttGlyphPen.py @@ -1,30 +1,31 @@ from array import array -from fontTools.misc.fixedTools import MAX_F2DOT14, otRound, floatToFixedToFloat +from typing import Any, Dict, Optional, Tuple +from fontTools.misc.fixedTools import MAX_F2DOT14, floatToFixedToFloat +from fontTools.misc.loggingTools import LogMixin +from fontTools.pens.pointPen import AbstractPointPen from fontTools.misc.roundTools import otRound -from fontTools.pens.basePen import LoggingPen -from fontTools.pens.transformPen import TransformPen +from fontTools.pens.basePen import LoggingPen, PenError +from fontTools.pens.transformPen import TransformPen, TransformPointPen from fontTools.ttLib.tables import ttProgram from fontTools.ttLib.tables._g_l_y_f import Glyph from fontTools.ttLib.tables._g_l_y_f import GlyphComponent from fontTools.ttLib.tables._g_l_y_f import GlyphCoordinates -__all__ = ["TTGlyphPen"] +__all__ = ["TTGlyphPen", "TTGlyphPointPen"] -class TTGlyphPen(LoggingPen): - """Pen used for drawing to a TrueType glyph. - - This pen can be used to construct or modify glyphs in a TrueType format - font. After using the pen to draw, use the ``.glyph()`` method to retrieve - a :py:class:`~._g_l_y_f.Glyph` object representing the glyph. - """ - - def __init__(self, glyphSet, handleOverflowingTransforms=True): - """Construct a new pen. +class _TTGlyphBasePen: + def __init__( + self, + glyphSet: Optional[Dict[str, Any]], + handleOverflowingTransforms: bool = True, + ) -> None: + """ + Construct a new pen. Args: - glyphSet (ttLib._TTGlyphSet): A glyphset object, used to resolve components. + glyphSet (Dict[str, Any]): A glyphset object, used to resolve components. handleOverflowingTransforms (bool): See below. If ``handleOverflowingTransforms`` is True, the components' transform values @@ -42,41 +43,152 @@ class TTGlyphPen(LoggingPen): If False, no check is done and all components are translated unmodified into the glyf table, followed by an inevitable ``struct.error`` once an attempt is made to compile them. + + If both contours and components are present in a glyph, the components + are decomposed. """ self.glyphSet = glyphSet self.handleOverflowingTransforms = handleOverflowingTransforms self.init() - def init(self): + def _decompose( + self, + glyphName: str, + transformation: Tuple[float, float, float, float, float, float], + ): + tpen = self.transformPen(self, transformation) + getattr(self.glyphSet[glyphName], self.drawMethod)(tpen) + + def _isClosed(self): + """ + Check if the current path is closed. + """ + raise NotImplementedError + + def init(self) -> None: self.points = [] self.endPts = [] self.types = [] self.components = [] - def _addPoint(self, pt, onCurve): + def addComponent( + self, + baseGlyphName: str, + transformation: Tuple[float, float, float, float, float, float], + identifier: Optional[str] = None, + **kwargs: Any, + ) -> None: + """ + Add a sub glyph. + """ + self.components.append((baseGlyphName, transformation)) + + def _buildComponents(self, componentFlags): + if self.handleOverflowingTransforms: + # we can't encode transform values > 2 or < -2 in F2Dot14, + # so we must decompose the glyph if any transform exceeds these + overflowing = any( + s > 2 or s < -2 + for (glyphName, transformation) in self.components + for s in transformation[:4] + ) + components = [] + for glyphName, transformation in self.components: + if glyphName not in self.glyphSet: + self.log.warning(f"skipped non-existing component '{glyphName}'") + continue + if self.points or (self.handleOverflowingTransforms and overflowing): + # can't have both coordinates and components, so decompose + self._decompose(glyphName, transformation) + continue + + component = GlyphComponent() + component.glyphName = glyphName + component.x, component.y = (otRound(v) for v in transformation[4:]) + # quantize floats to F2Dot14 so we get same values as when decompiled + # from a binary glyf table + transformation = tuple( + floatToFixedToFloat(v, 14) for v in transformation[:4] + ) + if transformation != (1, 0, 0, 1): + if self.handleOverflowingTransforms and any( + MAX_F2DOT14 < s <= 2 for s in transformation + ): + # clamp values ~= +2.0 so we can keep the component + transformation = tuple( + MAX_F2DOT14 if MAX_F2DOT14 < s <= 2 else s + for s in transformation + ) + component.transform = (transformation[:2], transformation[2:]) + component.flags = componentFlags + components.append(component) + return components + + def glyph(self, componentFlags: int = 0x4) -> Glyph: + """ + Returns a :py:class:`~._g_l_y_f.Glyph` object representing the glyph. + """ + if not self._isClosed(): + raise PenError("Didn't close last contour.") + components = self._buildComponents(componentFlags) + + glyph = Glyph() + glyph.coordinates = GlyphCoordinates(self.points) + glyph.coordinates.toInt() + glyph.endPtsOfContours = self.endPts + glyph.flags = array("B", self.types) + self.init() + + if components: + # If both components and contours were present, they have by now + # been decomposed by _buildComponents. + glyph.components = components + glyph.numberOfContours = -1 + else: + glyph.numberOfContours = len(glyph.endPtsOfContours) + glyph.program = ttProgram.Program() + glyph.program.fromBytecode(b"") + + return glyph + + +class TTGlyphPen(_TTGlyphBasePen, LoggingPen): + """ + Pen used for drawing to a TrueType glyph. + + This pen can be used to construct or modify glyphs in a TrueType format + font. After using the pen to draw, use the ``.glyph()`` method to retrieve + a :py:class:`~._g_l_y_f.Glyph` object representing the glyph. + """ + + drawMethod = "draw" + transformPen = TransformPen + + def _addPoint(self, pt: Tuple[float, float], onCurve: int) -> None: self.points.append(pt) self.types.append(onCurve) - def _popPoint(self): + def _popPoint(self) -> None: self.points.pop() self.types.pop() - def _isClosed(self): - return ( - (not self.points) or - (self.endPts and self.endPts[-1] == len(self.points) - 1)) + def _isClosed(self) -> bool: + return (not self.points) or ( + self.endPts and self.endPts[-1] == len(self.points) - 1 + ) - def lineTo(self, pt): + def lineTo(self, pt: Tuple[float, float]) -> None: self._addPoint(pt, 1) - def moveTo(self, pt): - assert self._isClosed(), '"move"-type point must begin a new contour.' + def moveTo(self, pt: Tuple[float, float]) -> None: + if not self._isClosed(): + raise PenError('"move"-type point must begin a new contour.') self._addPoint(pt, 1) - def curveTo(self, *points): + def curveTo(self, *points) -> None: raise NotImplementedError - def qCurveTo(self, *points): + def qCurveTo(self, *points) -> None: assert len(points) >= 1 for pt in points[:-1]: self._addPoint(pt, 0) @@ -85,7 +197,7 @@ class TTGlyphPen(LoggingPen): if points[-1] is not None: self._addPoint(points[-1], 1) - def closePath(self): + def closePath(self) -> None: endPt = len(self.points) - 1 # ignore anchors (one-point paths) @@ -103,72 +215,71 @@ class TTGlyphPen(LoggingPen): self.endPts.append(endPt) - def endPath(self): + def endPath(self) -> None: # TrueType contours are always "closed" self.closePath() - def addComponent(self, glyphName, transformation): - self.components.append((glyphName, transformation)) - def _buildComponents(self, componentFlags): - if self.handleOverflowingTransforms: - # we can't encode transform values > 2 or < -2 in F2Dot14, - # so we must decompose the glyph if any transform exceeds these - overflowing = any(s > 2 or s < -2 - for (glyphName, transformation) in self.components - for s in transformation[:4]) - components = [] - for glyphName, transformation in self.components: - if glyphName not in self.glyphSet: - self.log.warning( - "skipped non-existing component '%s'", glyphName - ) - continue - if (self.points or - (self.handleOverflowingTransforms and overflowing)): - # can't have both coordinates and components, so decompose - tpen = TransformPen(self, transformation) - self.glyphSet[glyphName].draw(tpen) - continue +class TTGlyphPointPen(_TTGlyphBasePen, LogMixin, AbstractPointPen): + """ + Point pen used for drawing to a TrueType glyph. - component = GlyphComponent() - component.glyphName = glyphName - component.x, component.y = (otRound(v) for v in transformation[4:]) - # quantize floats to F2Dot14 so we get same values as when decompiled - # from a binary glyf table - transformation = tuple( - floatToFixedToFloat(v, 14) for v in transformation[:4] - ) - if transformation != (1, 0, 0, 1): - if (self.handleOverflowingTransforms and - any(MAX_F2DOT14 < s <= 2 for s in transformation)): - # clamp values ~= +2.0 so we can keep the component - transformation = tuple(MAX_F2DOT14 if MAX_F2DOT14 < s <= 2 - else s for s in transformation) - component.transform = (transformation[:2], transformation[2:]) - component.flags = componentFlags - components.append(component) - return components + This pen can be used to construct or modify glyphs in a TrueType format + font. After using the pen to draw, use the ``.glyph()`` method to retrieve + a :py:class:`~._g_l_y_f.Glyph` object representing the glyph. + """ - def glyph(self, componentFlags=0x4): - """Returns a :py:class:`~._g_l_y_f.Glyph` object representing the glyph.""" - assert self._isClosed(), "Didn't close last contour." + drawMethod = "drawPoints" + transformPen = TransformPointPen - components = self._buildComponents(componentFlags) + def init(self) -> None: + super().init() + self._currentContourStartIndex = None - glyph = Glyph() - glyph.coordinates = GlyphCoordinates(self.points) - glyph.coordinates.toInt() - glyph.endPtsOfContours = self.endPts - glyph.flags = array("B", self.types) - self.init() + def _isClosed(self) -> bool: + return self._currentContourStartIndex is None - if components: - glyph.components = components - glyph.numberOfContours = -1 + def beginPath(self, identifier: Optional[str] = None, **kwargs: Any) -> None: + """ + Start a new sub path. + """ + if not self._isClosed(): + raise PenError("Didn't close previous contour.") + self._currentContourStartIndex = len(self.points) + + def endPath(self) -> None: + """ + End the current sub path. + """ + # TrueType contours are always "closed" + if self._isClosed(): + raise PenError("Contour is already closed.") + if self._currentContourStartIndex == len(self.points): + raise PenError("Tried to end an empty contour.") + self.endPts.append(len(self.points) - 1) + self._currentContourStartIndex = None + + def addPoint( + self, + pt: Tuple[float, float], + segmentType: Optional[str] = None, + smooth: bool = False, + name: Optional[str] = None, + identifier: Optional[str] = None, + **kwargs: Any, + ) -> None: + """ + Add a point to the current sub path. + """ + if self._isClosed(): + raise PenError("Can't add a point to a closed contour.") + if segmentType is None: + self.types.append(0) # offcurve + elif segmentType in ("qcurve", "line", "move"): + self.types.append(1) # oncurve + elif segmentType == "curve": + raise NotImplementedError("cubic curves are not supported") else: - glyph.numberOfContours = len(glyph.endPtsOfContours) - glyph.program = ttProgram.Program() - glyph.program.fromBytecode(b"") + raise AssertionError(segmentType) - return glyph + self.points.append(pt) diff --git a/Lib/fontTools/subset/__init__.py b/Lib/fontTools/subset/__init__.py index f687b056..53b440da 100644 --- a/Lib/fontTools/subset/__init__.py +++ b/Lib/fontTools/subset/__init__.py @@ -8,12 +8,15 @@ from fontTools.ttLib.tables import otTables from fontTools.otlLib.maxContextCalc import maxCtxFont from fontTools.pens.basePen import NullPen from fontTools.misc.loggingTools import Timer +from fontTools.subset.util import _add_method, _uniq_sort from fontTools.subset.cff import * +from fontTools.subset.svg import * import sys import struct import array import logging from collections import Counter, defaultdict +from functools import reduce from types import MethodType __usage__ = "pyftsubset font-file [glyph...] [--option=value]..." @@ -21,82 +24,100 @@ __usage__ = "pyftsubset font-file [glyph...] [--option=value]..." __doc__="""\ pyftsubset -- OpenType font subsetter and optimizer - pyftsubset is an OpenType font subsetter and optimizer, based on fontTools. - It accepts any TT- or CFF-flavored OpenType (.otf or .ttf) or WOFF (.woff) - font file. The subsetted glyph set is based on the specified glyphs - or characters, and specified OpenType layout features. - - The tool also performs some size-reducing optimizations, aimed for using - subset fonts as webfonts. Individual optimizations can be enabled or - disabled, and are enabled by default when they are safe. - -Usage: - """+__usage__+""" - - At least one glyph or one of --gids, --gids-file, --glyphs, --glyphs-file, - --text, --text-file, --unicodes, or --unicodes-file, must be specified. - -Arguments: - font-file - The input font file. - glyph - Specify one or more glyph identifiers to include in the subset. Must be - PS glyph names, or the special string '*' to keep the entire glyph set. - -Initial glyph set specification: - These options populate the initial glyph set. Same option can appear - multiple times, and the results are accummulated. - --gids=[,...] - Specify comma/whitespace-separated list of glyph IDs or ranges as - decimal numbers. For example, --gids=10-12,14 adds glyphs with - numbers 10, 11, 12, and 14. - --gids-file= - Like --gids but reads from a file. Anything after a '#' on any line - is ignored as comments. - --glyphs=[,...] - Specify comma/whitespace-separated PS glyph names to add to the subset. - Note that only PS glyph names are accepted, not gidNNN, U+XXXX, etc - that are accepted on the command line. The special string '*' will keep - the entire glyph set. - --glyphs-file= - Like --glyphs but reads from a file. Anything after a '#' on any line - is ignored as comments. - --text= - Specify characters to include in the subset, as UTF-8 string. - --text-file= - Like --text but reads from a file. Newline character are not added to - the subset. - --unicodes=[,...] - Specify comma/whitespace-separated list of Unicode codepoints or - ranges as hex numbers, optionally prefixed with 'U+', 'u', etc. - For example, --unicodes=41-5a,61-7a adds ASCII letters, so does - the more verbose --unicodes=U+0041-005A,U+0061-007A. - The special strings '*' will choose all Unicode characters mapped - by the font. - --unicodes-file= - Like --unicodes, but reads from a file. Anything after a '#' on any - line in the file is ignored as comments. - --ignore-missing-glyphs - Do not fail if some requested glyphs or gids are not available in - the font. - --no-ignore-missing-glyphs - Stop and fail if some requested glyphs or gids are not available - in the font. [default] - --ignore-missing-unicodes [default] - Do not fail if some requested Unicode characters (including those - indirectly specified using --text or --text-file) are not available - in the font. - --no-ignore-missing-unicodes - Stop and fail if some requested Unicode characters are not available - in the font. - Note the default discrepancy between ignoring missing glyphs versus - unicodes. This is for historical reasons and in the future - --no-ignore-missing-unicodes might become default. - -Other options: - For the other options listed below, to see the current value of the option, - pass a value of '?' to it, with or without a '='. - Examples: +pyftsubset is an OpenType font subsetter and optimizer, based on fontTools. +It accepts any TT- or CFF-flavored OpenType (.otf or .ttf) or WOFF (.woff) +font file. The subsetted glyph set is based on the specified glyphs +or characters, and specified OpenType layout features. + +The tool also performs some size-reducing optimizations, aimed for using +subset fonts as webfonts. Individual optimizations can be enabled or +disabled, and are enabled by default when they are safe. + +Usage: """+__usage__+""" + +At least one glyph or one of --gids, --gids-file, --glyphs, --glyphs-file, +--text, --text-file, --unicodes, or --unicodes-file, must be specified. + +Args: + +font-file + The input font file. +glyph + Specify one or more glyph identifiers to include in the subset. Must be + PS glyph names, or the special string '*' to keep the entire glyph set. + +Initial glyph set specification +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +These options populate the initial glyph set. Same option can appear +multiple times, and the results are accummulated. + +--gids=[,...] + Specify comma/whitespace-separated list of glyph IDs or ranges as decimal + numbers. For example, --gids=10-12,14 adds glyphs with numbers 10, 11, + 12, and 14. + +--gids-file= + Like --gids but reads from a file. Anything after a '#' on any line is + ignored as comments. + +--glyphs=[,...] + Specify comma/whitespace-separated PS glyph names to add to the subset. + Note that only PS glyph names are accepted, not gidNNN, U+XXXX, etc + that are accepted on the command line. The special string '*' will keep + the entire glyph set. + +--glyphs-file= + Like --glyphs but reads from a file. Anything after a '#' on any line + is ignored as comments. + +--text= + Specify characters to include in the subset, as UTF-8 string. + +--text-file= + Like --text but reads from a file. Newline character are not added to + the subset. + +--unicodes=[,...] + Specify comma/whitespace-separated list of Unicode codepoints or + ranges as hex numbers, optionally prefixed with 'U+', 'u', etc. + For example, --unicodes=41-5a,61-7a adds ASCII letters, so does + the more verbose --unicodes=U+0041-005A,U+0061-007A. + The special strings '*' will choose all Unicode characters mapped + by the font. + +--unicodes-file= + Like --unicodes, but reads from a file. Anything after a '#' on any + line in the file is ignored as comments. + +--ignore-missing-glyphs + Do not fail if some requested glyphs or gids are not available in + the font. + +--no-ignore-missing-glyphs + Stop and fail if some requested glyphs or gids are not available + in the font. [default] + +--ignore-missing-unicodes [default] + Do not fail if some requested Unicode characters (including those + indirectly specified using --text or --text-file) are not available + in the font. + +--no-ignore-missing-unicodes + Stop and fail if some requested Unicode characters are not available + in the font. + Note the default discrepancy between ignoring missing glyphs versus + unicodes. This is for historical reasons and in the future + --no-ignore-missing-unicodes might become default. + +Other options +^^^^^^^^^^^^^ + +For the other options listed below, to see the current value of the option, +pass a value of '?' to it, with or without a '='. + +Examples:: + $ pyftsubset --glyph-names? Current setting for 'glyph-names' is: False $ ./pyftsubset --name-IDs=? @@ -105,239 +126,299 @@ Other options: Current setting for 'hinting' is: True Current setting for 'hinting' is: False -Output options: - --output-file= - The output font file. If not specified, the subsetted font - will be saved in as font-file.subset. - --flavor= - Specify flavor of output font file. May be 'woff' or 'woff2'. - Note that WOFF2 requires the Brotli Python extension, available - at https://github.com/google/brotli - --with-zopfli - Use the Google Zopfli algorithm to compress WOFF. The output is 3-8 % - smaller than pure zlib, but the compression speed is much slower. - The Zopfli Python bindings are available at: - https://pypi.python.org/pypi/zopfli - -Glyph set expansion: - These options control how additional glyphs are added to the subset. - --retain-gids - Retain glyph indices; just empty glyphs not needed in-place. - --notdef-glyph - Add the '.notdef' glyph to the subset (ie, keep it). [default] - --no-notdef-glyph - Drop the '.notdef' glyph unless specified in the glyph set. This - saves a few bytes, but is not possible for Postscript-flavored - fonts, as those require '.notdef'. For TrueType-flavored fonts, - this works fine as long as no unsupported glyphs are requested - from the font. - --notdef-outline - Keep the outline of '.notdef' glyph. The '.notdef' glyph outline is - used when glyphs not supported by the font are to be shown. It is not - needed otherwise. - --no-notdef-outline - When including a '.notdef' glyph, remove its outline. This saves - a few bytes. [default] - --recommended-glyphs - Add glyphs 0, 1, 2, and 3 to the subset, as recommended for - TrueType-flavored fonts: '.notdef', 'NULL' or '.null', 'CR', 'space'. - Some legacy software might require this, but no modern system does. - --no-recommended-glyphs - Do not add glyphs 0, 1, 2, and 3 to the subset, unless specified in - glyph set. [default] - --no-layout-closure - Do not expand glyph set to add glyphs produced by OpenType layout - features. Instead, OpenType layout features will be subset to only - rules that are relevant to the otherwise-specified glyph set. - --layout-features[+|-]=[,...] - Specify (=), add to (+=) or exclude from (-=) the comma-separated - set of OpenType layout feature tags that will be preserved. - Glyph variants used by the preserved features are added to the - specified subset glyph set. By default, 'calt', 'ccmp', 'clig', 'curs', - 'dnom', 'frac', 'kern', 'liga', 'locl', 'mark', 'mkmk', 'numr', 'rclt', - 'rlig', 'rvrn', and all features required for script shaping are - preserved. To see the full list, try '--layout-features=?'. - Use '*' to keep all features. - Multiple --layout-features options can be provided if necessary. - Examples: - --layout-features+=onum,pnum,ss01 - * Keep the default set of features and 'onum', 'pnum', 'ss01'. - --layout-features-='mark','mkmk' - * Keep the default set of features but drop 'mark' and 'mkmk'. - --layout-features='kern' - * Only keep the 'kern' feature, drop all others. - --layout-features='' - * Drop all features. - --layout-features='*' - * Keep all features. - --layout-features+=aalt --layout-features-=vrt2 - * Keep default set of features plus 'aalt', but drop 'vrt2'. - --layout-scripts[+|-]= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/feaLib/data/delete_glyph.fea b/Tests/feaLib/data/delete_glyph.fea index 36e0f0f9..ab4b93f1 100644 --- a/Tests/feaLib/data/delete_glyph.fea +++ b/Tests/feaLib/data/delete_glyph.fea @@ -1,3 +1,7 @@ feature test { sub a by NULL; } test; + +feature test { + sub [a b c] by NULL; +} test; diff --git a/Tests/feaLib/data/delete_glyph.ttx b/Tests/feaLib/data/delete_glyph.ttx index 777f6e36..b28259fb 100644 --- a/Tests/feaLib/data/delete_glyph.ttx +++ b/Tests/feaLib/data/delete_glyph.ttx @@ -22,13 +22,14 @@ - + + - + @@ -37,6 +38,16 @@ + + + + + + + + + + diff --git a/Tests/feaLib/data/variable_conditionset.fea b/Tests/feaLib/data/variable_conditionset.fea new file mode 100644 index 00000000..7009c62b --- /dev/null +++ b/Tests/feaLib/data/variable_conditionset.fea @@ -0,0 +1,13 @@ +languagesystem DFLT dflt; + +lookup symbols_heavy { + sub a by b; +} symbols_heavy; + +conditionset heavy { + wght 700 900; +} heavy; + +variation rvrn heavy { + lookup symbols_heavy; +} rvrn; diff --git a/Tests/feaLib/data/variable_conditionset.ttx b/Tests/feaLib/data/variable_conditionset.ttx new file mode 100644 index 00000000..18b156fa --- /dev/null +++ b/Tests/feaLib/data/variable_conditionset.ttx @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/feaLib/data/variable_scalar_anchor.fea b/Tests/feaLib/data/variable_scalar_anchor.fea new file mode 100644 index 00000000..c4787986 --- /dev/null +++ b/Tests/feaLib/data/variable_scalar_anchor.fea @@ -0,0 +1,4 @@ +languagesystem DFLT dflt; +feature kern { + pos cursive one ; +} kern; diff --git a/Tests/feaLib/data/variable_scalar_anchor.ttx b/Tests/feaLib/data/variable_scalar_anchor.ttx new file mode 100644 index 00000000..6bb55691 --- /dev/null +++ b/Tests/feaLib/data/variable_scalar_anchor.ttx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/feaLib/data/variable_scalar_valuerecord.fea b/Tests/feaLib/data/variable_scalar_valuerecord.fea new file mode 100644 index 00000000..bf9a26b7 --- /dev/null +++ b/Tests/feaLib/data/variable_scalar_valuerecord.fea @@ -0,0 +1,5 @@ +languagesystem DFLT dflt; +feature kern { + pos one 1; + pos two <0 (wght=200:12 wght=900:22 wdth=150,wght=900:42) 0 0>; +} kern; diff --git a/Tests/feaLib/data/variable_scalar_valuerecord.ttx b/Tests/feaLib/data/variable_scalar_valuerecord.ttx new file mode 100644 index 00000000..338b7221 --- /dev/null +++ b/Tests/feaLib/data/variable_scalar_valuerecord.ttx @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/feaLib/lexer_test.py b/Tests/feaLib/lexer_test.py index 24dc5dba..3df67f70 100644 --- a/Tests/feaLib/lexer_test.py +++ b/Tests/feaLib/lexer_test.py @@ -1,6 +1,6 @@ -from fontTools.misc.py23 import tobytes from fontTools.feaLib.error import FeatureLibError, IncludedFeaNotFound from fontTools.feaLib.lexer import IncludingLexer, Lexer +from fontTools.misc.textTools import tobytes from io import StringIO import os import shutil diff --git a/Tests/feaLib/parser_test.py b/Tests/feaLib/parser_test.py index de2bc3ca..fd9dea70 100644 --- a/Tests/feaLib/parser_test.py +++ b/Tests/feaLib/parser_test.py @@ -14,8 +14,9 @@ def glyphstr(glyphs): if len(x) == 1: return list(x)[0] else: - return '[%s]' % ' '.join(sorted(list(x))) - return ' '.join(f(g.glyphSet()) for g in glyphs) + return "[%s]" % " ".join(sorted(list(x))) + + return " ".join(f(g.glyphSet()) for g in glyphs) def mapping(s): @@ -30,7 +31,9 @@ def mapping(s): return dict(zip(b, c)) -GLYPHNAMES = (""" +GLYPHNAMES = ( + ( + """ .notdef space 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 A.sc B.sc C.sc D.sc E.sc F.sc G.sc H.sc I.sc J.sc K.sc L.sc M.sc N.sc O.sc P.sc Q.sc R.sc S.sc T.sc U.sc V.sc W.sc X.sc Y.sc Z.sc @@ -48,7 +51,10 @@ GLYPHNAMES = (""" cid00111 cid00222 comma endash emdash figuredash damma hamza c_d d.alt n.end s.end f_f -""").split() + ["foo.%d" % i for i in range(1, 200)] +""" + ).split() + + ["foo.%d" % i for i in range(1, 200)] +) class ParserTest(unittest.TestCase): @@ -60,7 +66,7 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex = self.assertRaisesRegexp def test_glyphMap_deprecated(self): - glyphMap = {'a': 0, 'b': 1, 'c': 2} + glyphMap = {"a": 0, "b": 1, "c": 2} with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") parser = Parser(StringIO(), glyphMap=glyphMap) @@ -68,22 +74,28 @@ class ParserTest(unittest.TestCase): self.assertEqual(len(w), 1) self.assertEqual(w[-1].category, UserWarning) self.assertIn("deprecated", str(w[-1].message)) - self.assertEqual(parser.glyphNames_, {'a', 'b', 'c'}) + self.assertEqual(parser.glyphNames_, {"a", "b", "c"}) self.assertRaisesRegex( - TypeError, "mutually exclusive", - Parser, StringIO(), ("a",), glyphMap={"a": 0}) + TypeError, + "mutually exclusive", + Parser, + StringIO(), + ("a",), + glyphMap={"a": 0}, + ) self.assertRaisesRegex( - TypeError, "unsupported keyword argument", - Parser, StringIO(), foo="bar") + TypeError, "unsupported keyword argument", Parser, StringIO(), foo="bar" + ) def test_comments(self): doc = self.parse( """ # Initial feature test { sub A by B; # simple - } test;""") + } test;""" + ) c1 = doc.statements[0] c2 = doc.statements[1].statements[1] self.assertEqual(type(c1), ast.Comment) @@ -94,9 +106,11 @@ class ParserTest(unittest.TestCase): self.assertEqual(doc.statements[1].name, "test") def test_only_comments(self): - doc = self.parse("""\ + doc = self.parse( + """\ # Initial - """) + """ + ) c1 = doc.statements[0] self.assertEqual(type(c1), ast.Comment) self.assertEqual(c1.text, "# Initial") @@ -106,7 +120,8 @@ class ParserTest(unittest.TestCase): doc = self.parse( "feature test {" " pos cursive A ;" - "} test;") + "} test;" + ) anchor = doc.statements[0].statements[0].entryAnchor self.assertEqual(type(anchor), ast.Anchor) self.assertEqual(anchor.x, 120) @@ -119,7 +134,8 @@ class ParserTest(unittest.TestCase): doc = self.parse( "feature test {" " pos cursive A ;" - "} test;") + "} test;" + ) anchor = doc.statements[0].statements[0].entryAnchor self.assertEqual(type(anchor), ast.Anchor) self.assertEqual(anchor.x, 120) @@ -134,7 +150,8 @@ class ParserTest(unittest.TestCase): " pos cursive A " " >" " ;" - "} test;") + "} test;" + ) anchor = doc.statements[0].statements[0].entryAnchor self.assertEqual(type(anchor), ast.Anchor) self.assertEqual(anchor.x, 120) @@ -147,7 +164,8 @@ class ParserTest(unittest.TestCase): doc = self.parse( "feature test {" " pos cursive A ;" - "} test;") + "} test;" + ) anchor = doc.statements[0].statements[0].exitAnchor self.assertIsNone(anchor) @@ -156,7 +174,8 @@ class ParserTest(unittest.TestCase): "feature test {" " anchorDef 120 -20 contourpoint 7 Foo;" " pos cursive A ;" - "} test;") + "} test;" + ) anchor = doc.statements[0].statements[1].entryAnchor self.assertEqual(type(anchor), ast.Anchor) self.assertEqual(anchor.x, 120) @@ -167,10 +186,25 @@ class ParserTest(unittest.TestCase): def test_anchor_format_e_undefined(self): self.assertRaisesRegex( - FeatureLibError, 'Unknown anchor "UnknownName"', self.parse, + FeatureLibError, + 'Unknown anchor "UnknownName"', + self.parse, "feature test {" " position cursive A ;" - "} test;") + "} test;", + ) + + def test_anchor_variable_scalar(self): + doc = self.parse( + "feature test {" + " pos cursive A ;" + "} test;" + ) + anchor = doc.statements[0].statements[0].entryAnchor + self.assertEqual( + anchor.asFea(), + "", + ) def test_anchordef(self): [foo] = self.parse("anchorDef 123 456 foo;").statements @@ -203,8 +237,11 @@ class ParserTest(unittest.TestCase): def test_anon_missingBrace(self): self.assertRaisesRegex( - FeatureLibError, "Expected '} TEST;' to terminate anonymous block", - self.parse, "anon TEST { \n no end in sight") + FeatureLibError, + "Expected '} TEST;' to terminate anonymous block", + self.parse, + "anon TEST { \n no end in sight", + ) def test_attach(self): doc = self.parse("table GDEF {Attach [a e] 2;} GDEF;") @@ -222,8 +259,7 @@ class ParserTest(unittest.TestCase): [liga] = self.parse("feature liga useExtension {} liga;").statements self.assertEqual(liga.name, "liga") self.assertTrue(liga.use_extension) - self.assertEqual(liga.asFea(), - "feature liga useExtension {\n \n} liga;\n") + self.assertEqual(liga.asFea(), "feature liga useExtension {\n \n} liga;\n") def test_feature_comment(self): [liga] = self.parse("feature liga { # Comment\n } liga;").statements @@ -239,12 +275,16 @@ class ParserTest(unittest.TestCase): def test_FeatureNames_bad(self): self.assertRaisesRegex( - FeatureLibError, 'Expected "name"', - self.parse, "feature ss01 { featureNames { feature test; } ss01;") + FeatureLibError, + 'Expected "name"', + self.parse, + "feature ss01 { featureNames { feature test; } ss01;", + ) def test_FeatureNames_comment(self): [feature] = self.parse( - "feature ss01 { featureNames { # Comment\n }; } ss01;").statements + "feature ss01 { featureNames { # Comment\n }; } ss01;" + ).statements [featureNames] = feature.statements self.assertIsInstance(featureNames, ast.NestedBlock) [comment] = featureNames.statements @@ -253,7 +293,8 @@ class ParserTest(unittest.TestCase): def test_FeatureNames_emptyStatements(self): [feature] = self.parse( - "feature ss01 { featureNames { ;;; }; } ss01;").statements + "feature ss01 { featureNames { ;;; }; } ss01;" + ).statements [featureNames] = feature.statements self.assertIsInstance(featureNames, ast.NestedBlock) self.assertEqual(featureNames.statements, []) @@ -266,8 +307,11 @@ class ParserTest(unittest.TestCase): def test_FontRevision_negative(self): self.assertRaisesRegex( - FeatureLibError, "Font revision numbers must be positive", - self.parse, "table head {FontRevision -17.2;} head;") + FeatureLibError, + "Font revision numbers must be positive", + self.parse, + "table head {FontRevision -17.2;} head;", + ) def test_strict_glyph_name_check(self): self.parse("@bad = [a b ccc];", glyphNames=("a", "b", "ccc")) @@ -282,14 +326,19 @@ class ParserTest(unittest.TestCase): def test_glyphclass_glyphNameTooLong(self): self.assertRaisesRegex( - FeatureLibError, "must not be longer than 63 characters", - self.parse, "@GlyphClass = [%s];" % ("G" * 64)) + FeatureLibError, + "must not be longer than 63 characters", + self.parse, + "@GlyphClass = [%s];" % ("G" * 64), + ) def test_glyphclass_bad(self): self.assertRaisesRegex( FeatureLibError, "Expected glyph name, glyph range, or glyph class reference", - self.parse, "@bad = [a 123];") + self.parse, + "@bad = [a 123];", + ) def test_glyphclass_duplicate(self): # makeotf accepts this, so we should too @@ -312,9 +361,11 @@ class ParserTest(unittest.TestCase): "markClass [acute grave] @TOP_MARKS;" "markClass cedilla @BOTTOM_MARKS;" "@MARKS = [@TOP_MARKS @BOTTOM_MARKS ogonek];" - "@ALL = @MARKS;") - self.assertEqual(doc.statements[-1].glyphSet(), - ("acute", "grave", "cedilla", "ogonek")) + "@ALL = @MARKS;" + ) + self.assertEqual( + doc.statements[-1].glyphSet(), ("acute", "grave", "cedilla", "ogonek") + ) def test_glyphclass_range_cid(self): [gc] = self.parse(r"@GlyphClass = [\999-\1001];").statements @@ -325,7 +376,9 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, "Bad range: start should be less than limit", - self.parse, r"@bad = [\998-\995];") + self.parse, + r"@bad = [\998-\995];", + ) def test_glyphclass_range_uppercase(self): [gc] = self.parse("@swashes = [X.swash-Z.swash];").statements @@ -355,7 +408,9 @@ class ParserTest(unittest.TestCase): # https://github.com/fonttools/fonttools/issues/1768 glyphNames = () with CapturingLogHandler("fontTools.feaLib.parser", level="WARNING") as caplog: - [gc] = self.parse("@class = [A-foo.sc B-foo.sc C D];", glyphNames).statements + [gc] = self.parse( + "@class = [A-foo.sc B-foo.sc C D];", glyphNames + ).statements self.assertEqual(gc.glyphSet(), ("A-foo.sc", "B-foo.sc", "C", "D")) self.assertEqual(len(caplog.records), 2) caplog.assertRegex("Ambiguous glyph name that looks like a range:") @@ -364,8 +419,7 @@ class ParserTest(unittest.TestCase): # The OpenType Feature File Specification v1.20 makes it clear # that if a dashed name could be interpreted either as a glyph name # or as a range, then the semantics should be the single dashed name. - glyphNames = ( - "A-foo.sc-C-foo.sc A-foo.sc B-foo.sc C-foo.sc".split()) + glyphNames = "A-foo.sc-C-foo.sc A-foo.sc B-foo.sc C-foo.sc".split() [gc] = self.parse("@range = [A-foo.sc-C-foo.sc];", glyphNames).statements self.assertEqual(gc.glyphSet(), ("A-foo.sc-C-foo.sc",)) @@ -375,7 +429,10 @@ class ParserTest(unittest.TestCase): FeatureLibError, 'Ambiguous glyph range "A-B-C"; ' 'please use "A - B-C" or "A-B - C" to clarify what you mean', - self.parse, r"@bad = [A-B-C];", glyphNames) + self.parse, + r"@bad = [A-B-C];", + glyphNames, + ) def test_glyphclass_range_digit1(self): [gc] = self.parse("@range = [foo.2-foo.5];").statements @@ -392,36 +449,50 @@ class ParserTest(unittest.TestCase): def test_glyphclass_range_bad(self): self.assertRaisesRegex( FeatureLibError, - "Bad range: \"a\" and \"foobar\" should have the same length", - self.parse, "@bad = [a-foobar];") + 'Bad range: "a" and "foobar" should have the same length', + self.parse, + "@bad = [a-foobar];", + ) self.assertRaisesRegex( - FeatureLibError, "Bad range: \"A.swash-z.swash\"", - self.parse, "@bad = [A.swash-z.swash];") + FeatureLibError, + 'Bad range: "A.swash-z.swash"', + self.parse, + "@bad = [A.swash-z.swash];", + ) self.assertRaisesRegex( - FeatureLibError, "Start of range must be smaller than its end", - self.parse, "@bad = [B.swash-A.swash];") + FeatureLibError, + "Start of range must be smaller than its end", + self.parse, + "@bad = [B.swash-A.swash];", + ) self.assertRaisesRegex( - FeatureLibError, "Bad range: \"foo.1234-foo.9876\"", - self.parse, "@bad = [foo.1234-foo.9876];") + FeatureLibError, + 'Bad range: "foo.1234-foo.9876"', + self.parse, + "@bad = [foo.1234-foo.9876];", + ) def test_glyphclass_range_mixed(self): [gc] = self.parse("@range = [a foo.09-foo.11 X.sc-Z.sc];").statements - self.assertEqual(gc.glyphSet(), ( - "a", "foo.09", "foo.10", "foo.11", "X.sc", "Y.sc", "Z.sc" - )) + self.assertEqual( + gc.glyphSet(), ("a", "foo.09", "foo.10", "foo.11", "X.sc", "Y.sc", "Z.sc") + ) def test_glyphclass_reference(self): [vowels_lc, vowels_uc, vowels] = self.parse( "@Vowels.lc = [a e i o u]; @Vowels.uc = [A E I O U];" - "@Vowels = [@Vowels.lc @Vowels.uc y Y];").statements + "@Vowels = [@Vowels.lc @Vowels.uc y Y];" + ).statements self.assertEqual(vowels_lc.glyphSet(), tuple("aeiou")) self.assertEqual(vowels_uc.glyphSet(), tuple("AEIOU")) self.assertEqual(vowels.glyphSet(), tuple("aeiouAEIOUyY")) - self.assertEqual(vowels.asFea(), - "@Vowels = [@Vowels.lc @Vowels.uc y Y];") + self.assertEqual(vowels.asFea(), "@Vowels = [@Vowels.lc @Vowels.uc y Y];") self.assertRaisesRegex( - FeatureLibError, "Unknown glyph class @unknown", - self.parse, "@bad = [@unknown];") + FeatureLibError, + "Unknown glyph class @unknown", + self.parse, + "@bad = [@unknown];", + ) def test_glyphclass_scoping(self): [foo, liga, smcp] = self.parse( @@ -439,8 +510,7 @@ class ParserTest(unittest.TestCase): "feature F1 { lookup L { @GLYPHCLASS = [A B C];} L; } F1;" "feature F2 { sub @GLYPHCLASS by D; } F2;" ).statements - self.assertEqual(list(f2.statements[0].glyphs[0].glyphSet()), - ["A", "B", "C"]) + self.assertEqual(list(f2.statements[0].glyphs[0].glyphSet()), ["A", "B", "C"]) def test_GlyphClassDef(self): doc = self.parse("table GDEF {GlyphClassDef [b],[l],[m],[C c];} GDEF;") @@ -473,9 +543,8 @@ class ParserTest(unittest.TestCase): def test_ignore_position(self): doc = self.parse( - "feature test {" - " ignore position f [a e] d' [a u]' [e y];" - "} test;") + "feature test {" " ignore position f [a e] d' [a u]' [e y];" "} test;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.IgnorePosStatement) [(prefix, glyphs, suffix)] = sub.chainContexts @@ -489,7 +558,8 @@ class ParserTest(unittest.TestCase): 'No lookups can be specified for "ignore pos"', self.parse, "lookup L { pos [A A.sc] -100; } L;" - "feature test { ignore pos f' i', A' lookup L; } test;") + "feature test { ignore pos f' i', A' lookup L; } test;", + ) def test_ignore_sub(self): doc = self.parse("feature test {ignore sub e t' c, q u' u' x;} test;") @@ -505,9 +575,8 @@ class ParserTest(unittest.TestCase): def test_ignore_substitute(self): doc = self.parse( - "feature test {" - " ignore substitute f [a e] d' [a u]' [e y];" - "} test;") + "feature test {" " ignore substitute f [a e] d' [a u]' [e y];" "} test;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.IgnoreSubstStatement) [(prefix, glyphs, suffix)] = sub.chainContexts @@ -521,15 +590,19 @@ class ParserTest(unittest.TestCase): 'No lookups can be specified for "ignore sub"', self.parse, "lookup L { sub [A A.sc] by a; } L;" - "feature test { ignore sub f' i', A' lookup L; } test;") + "feature test { ignore sub f' i', A' lookup L; } test;", + ) def test_include_statement(self): - doc = self.parse("""\ + doc = self.parse( + """\ include(../family.fea); include # Comment (foo) ; - """, followIncludes=False) + """, + followIncludes=False, + ) s1, s2, s3 = doc.statements self.assertEqual(type(s1), ast.IncludeStatement) self.assertEqual(s1.filename, "../family.fea") @@ -541,9 +614,12 @@ class ParserTest(unittest.TestCase): self.assertEqual(s3.text, "# Comment") def test_include_statement_no_semicolon(self): - doc = self.parse("""\ + doc = self.parse( + """\ include(../family.fea) - """, followIncludes=False) + """, + followIncludes=False, + ) s1 = doc.statements[0] self.assertEqual(type(s1), ast.IncludeStatement) self.assertEqual(s1.filename, "../family.fea") @@ -566,9 +642,9 @@ class ParserTest(unittest.TestCase): self.assertFalse(s.required) def test_language_exclude_dflt_required(self): - doc = self.parse("feature test {" - " language DEU exclude_dflt required;" - "} test;") + doc = self.parse( + "feature test {" " language DEU exclude_dflt required;" "} test;" + ) s = doc.statements[0].statements[0] self.assertEqual(type(s), ast.LanguageStatement) self.assertEqual(s.language, "DEU ") @@ -584,9 +660,9 @@ class ParserTest(unittest.TestCase): self.assertFalse(s.required) def test_language_include_dflt_required(self): - doc = self.parse("feature test {" - " language DEU include_dflt required;" - "} test;") + doc = self.parse( + "feature test {" " language DEU include_dflt required;" "} test;" + ) s = doc.statements[0].statements[0] self.assertEqual(type(s), ast.LanguageStatement) self.assertEqual(s.language, "DEU ") @@ -597,7 +673,9 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, '"DFLT" is not a valid language tag; use "dflt" instead', - self.parse, "feature test { language DFLT; } test;") + self.parse, + "feature test { language DFLT; } test;", + ) def test_ligatureCaretByIndex_glyphClass(self): doc = self.parse("table GDEF{LigatureCaretByIndex [c_t f_i] 2;}GDEF;") @@ -636,20 +714,21 @@ class ParserTest(unittest.TestCase): [lookup] = self.parse("lookup Foo useExtension {} Foo;").statements self.assertEqual(lookup.name, "Foo") self.assertTrue(lookup.use_extension) - self.assertEqual(lookup.asFea(), - "lookup Foo useExtension {\n \n} Foo;\n") + self.assertEqual(lookup.asFea(), "lookup Foo useExtension {\n \n} Foo;\n") def test_lookup_block_name_mismatch(self): self.assertRaisesRegex( - FeatureLibError, 'Expected "Foo"', - self.parse, "lookup Foo {} Bar;") + FeatureLibError, 'Expected "Foo"', self.parse, "lookup Foo {} Bar;" + ) def test_lookup_block_with_horizontal_valueRecordDef(self): - doc = self.parse("feature liga {" - " lookup look {" - " valueRecordDef 123 foo;" - " } look;" - "} liga;") + doc = self.parse( + "feature liga {" + " lookup look {" + " valueRecordDef 123 foo;" + " } look;" + "} liga;" + ) [liga] = doc.statements [look] = liga.statements [foo] = look.statements @@ -657,11 +736,13 @@ class ParserTest(unittest.TestCase): self.assertIsNone(foo.value.yAdvance) def test_lookup_block_with_vertical_valueRecordDef(self): - doc = self.parse("feature vkrn {" - " lookup look {" - " valueRecordDef 123 foo;" - " } look;" - "} vkrn;") + doc = self.parse( + "feature vkrn {" + " lookup look {" + " valueRecordDef 123 foo;" + " } look;" + "} vkrn;" + ) [vkrn] = doc.statements [look] = vkrn.statements [foo] = look.statements @@ -675,15 +756,17 @@ class ParserTest(unittest.TestCase): self.assertEqual(comment.text, "# Comment") def test_lookup_reference(self): - [foo, bar] = self.parse("lookup Foo {} Foo;" - "feature Bar {lookup Foo;} Bar;").statements + [foo, bar] = self.parse( + "lookup Foo {} Foo;" "feature Bar {lookup Foo;} Bar;" + ).statements [ref] = bar.statements self.assertEqual(type(ref), ast.LookupReferenceStatement) self.assertEqual(ref.lookup, foo) def test_lookup_reference_to_lookup_inside_feature(self): - [qux, bar] = self.parse("feature Qux {lookup Foo {} Foo;} Qux;" - "feature Bar {lookup Foo;} Bar;").statements + [qux, bar] = self.parse( + "feature Qux {lookup Foo {} Foo;} Qux;" "feature Bar {lookup Foo;} Bar;" + ).statements [foo] = qux.statements [ref] = bar.statements self.assertIsInstance(ref, ast.LookupReferenceStatement) @@ -691,8 +774,11 @@ class ParserTest(unittest.TestCase): def test_lookup_reference_unknown(self): self.assertRaisesRegex( - FeatureLibError, 'Unknown lookup "Huh"', - self.parse, "feature liga {lookup Huh;} liga;") + FeatureLibError, + 'Unknown lookup "Huh"', + self.parse, + "feature liga {lookup Huh;} liga;", + ) def parse_lookupflag_(self, s): return self.parse("lookup L {%s} L;" % s).statements[0].statements[-1] @@ -708,52 +794,59 @@ class ParserTest(unittest.TestCase): def test_lookupflag_format_A_MarkAttachmentType(self): flag = self.parse_lookupflag_( "@TOP_MARKS = [acute grave macron];" - "lookupflag RightToLeft MarkAttachmentType @TOP_MARKS;") + "lookupflag RightToLeft MarkAttachmentType @TOP_MARKS;" + ) self.assertIsInstance(flag, ast.LookupFlagStatement) self.assertEqual(flag.value, 1) self.assertIsInstance(flag.markAttachment, ast.GlyphClassName) - self.assertEqual(flag.markAttachment.glyphSet(), - ("acute", "grave", "macron")) + self.assertEqual(flag.markAttachment.glyphSet(), ("acute", "grave", "macron")) self.assertIsNone(flag.markFilteringSet) - self.assertEqual(flag.asFea(), - "lookupflag RightToLeft MarkAttachmentType @TOP_MARKS;") + self.assertEqual( + flag.asFea(), "lookupflag RightToLeft MarkAttachmentType @TOP_MARKS;" + ) def test_lookupflag_format_A_MarkAttachmentType_glyphClass(self): flag = self.parse_lookupflag_( - "lookupflag RightToLeft MarkAttachmentType [acute grave macron];") + "lookupflag RightToLeft MarkAttachmentType [acute grave macron];" + ) self.assertIsInstance(flag, ast.LookupFlagStatement) self.assertEqual(flag.value, 1) self.assertIsInstance(flag.markAttachment, ast.GlyphClass) - self.assertEqual(flag.markAttachment.glyphSet(), - ("acute", "grave", "macron")) + self.assertEqual(flag.markAttachment.glyphSet(), ("acute", "grave", "macron")) self.assertIsNone(flag.markFilteringSet) - self.assertEqual(flag.asFea(), - "lookupflag RightToLeft MarkAttachmentType [acute grave macron];") + self.assertEqual( + flag.asFea(), + "lookupflag RightToLeft MarkAttachmentType [acute grave macron];", + ) def test_lookupflag_format_A_UseMarkFilteringSet(self): flag = self.parse_lookupflag_( "@BOTTOM_MARKS = [cedilla ogonek];" - "lookupflag UseMarkFilteringSet @BOTTOM_MARKS IgnoreLigatures;") + "lookupflag UseMarkFilteringSet @BOTTOM_MARKS IgnoreLigatures;" + ) self.assertIsInstance(flag, ast.LookupFlagStatement) self.assertEqual(flag.value, 4) self.assertIsNone(flag.markAttachment) self.assertIsInstance(flag.markFilteringSet, ast.GlyphClassName) - self.assertEqual(flag.markFilteringSet.glyphSet(), - ("cedilla", "ogonek")) - self.assertEqual(flag.asFea(), - "lookupflag IgnoreLigatures UseMarkFilteringSet @BOTTOM_MARKS;") + self.assertEqual(flag.markFilteringSet.glyphSet(), ("cedilla", "ogonek")) + self.assertEqual( + flag.asFea(), + "lookupflag IgnoreLigatures UseMarkFilteringSet @BOTTOM_MARKS;", + ) def test_lookupflag_format_A_UseMarkFilteringSet_glyphClass(self): flag = self.parse_lookupflag_( - "lookupflag UseMarkFilteringSet [cedilla ogonek] IgnoreLigatures;") + "lookupflag UseMarkFilteringSet [cedilla ogonek] IgnoreLigatures;" + ) self.assertIsInstance(flag, ast.LookupFlagStatement) self.assertEqual(flag.value, 4) self.assertIsNone(flag.markAttachment) self.assertIsInstance(flag.markFilteringSet, ast.GlyphClass) - self.assertEqual(flag.markFilteringSet.glyphSet(), - ("cedilla", "ogonek")) - self.assertEqual(flag.asFea(), - "lookupflag IgnoreLigatures UseMarkFilteringSet [cedilla ogonek];") + self.assertEqual(flag.markFilteringSet.glyphSet(), ("cedilla", "ogonek")) + self.assertEqual( + flag.asFea(), + "lookupflag IgnoreLigatures UseMarkFilteringSet [cedilla ogonek];", + ) def test_lookupflag_format_B(self): flag = self.parse_lookupflag_("lookupflag 7;") @@ -761,8 +854,9 @@ class ParserTest(unittest.TestCase): self.assertEqual(flag.value, 7) self.assertIsNone(flag.markAttachment) self.assertIsNone(flag.markFilteringSet) - self.assertEqual(flag.asFea(), - "lookupflag RightToLeft IgnoreBaseGlyphs IgnoreLigatures;") + self.assertEqual( + flag.asFea(), "lookupflag RightToLeft IgnoreBaseGlyphs IgnoreLigatures;" + ) def test_lookupflag_format_B_zero(self): flag = self.parse_lookupflag_("lookupflag 0;") @@ -775,22 +869,26 @@ class ParserTest(unittest.TestCase): def test_lookupflag_no_value(self): self.assertRaisesRegex( FeatureLibError, - 'lookupflag must have a value', + "lookupflag must have a value", self.parse, - "feature test {lookupflag;} test;") + "feature test {lookupflag;} test;", + ) def test_lookupflag_repeated(self): self.assertRaisesRegex( FeatureLibError, - 'RightToLeft can be specified only once', + "RightToLeft can be specified only once", self.parse, - "feature test {lookupflag RightToLeft RightToLeft;} test;") + "feature test {lookupflag RightToLeft RightToLeft;} test;", + ) def test_lookupflag_unrecognized(self): self.assertRaisesRegex( FeatureLibError, '"IgnoreCookies" is not a recognized lookupflag', - self.parse, "feature test {lookupflag IgnoreCookies;} test;") + self.parse, + "feature test {lookupflag IgnoreCookies;} test;", + ) def test_gpos_type_1_glyph(self): doc = self.parse("feature kern {pos one <1 2 3 4>;} kern;") @@ -834,11 +932,15 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, '"enumerate" is only allowed with pair positionings', - self.parse, "feature test {enum pos T 100;} test;") + self.parse, + "feature test {enum pos T 100;} test;", + ) self.assertRaisesRegex( FeatureLibError, '"enumerate" is only allowed with pair positionings', - self.parse, "feature test {enumerate pos T 100;} test;") + self.parse, + "feature test {enumerate pos T 100;} test;", + ) def test_gpos_type_1_chained(self): doc = self.parse("feature kern {pos [A B] [T Y]' 20 comma;} kern;") @@ -870,10 +972,47 @@ class ParserTest(unittest.TestCase): self.assertEqual(glyphstr(pos.prefix), "[A B]") self.assertEqual(glyphstr(pos.suffix), "comma") + def test_gpos_type_1_chained_special_kern_format_valuerecord_format_b_bug2293(self): + # https://github.com/fonttools/fonttools/issues/2293 + doc = self.parse("feature kern {pos [A B] [T Y]' comma a <0 0 0 0>;} kern;") + pos = doc.statements[0].statements[0] + self.assertIsInstance(pos, ast.SinglePosStatement) + [(glyphs, value)] = pos.pos + self.assertEqual(glyphstr([glyphs]), "[T Y]") + self.assertEqual(value.asFea(), "<0 0 0 0>") + self.assertEqual(glyphstr(pos.prefix), "[A B]") + self.assertEqual(glyphstr(pos.suffix), "comma a") + + def test_gpos_type_1_chained_exception1(self): + with self.assertRaisesRegex(FeatureLibError, "Positioning values are allowed"): + doc = self.parse( + "feature kern {" " pos [A B]' [T Y]' comma a <0 0 0 0>;" "} kern;" + ) + + def test_gpos_type_1_chained_exception2(self): + with self.assertRaisesRegex(FeatureLibError, "Positioning values are allowed"): + doc = self.parse( + "feature kern {" + " pos [A B]' <0 0 0 0> [T Y]' comma a <0 0 0 0>;" + "} kern;" + ) + + def test_gpos_type_1_chained_exception3(self): + with self.assertRaisesRegex(FeatureLibError, "Positioning cannot be applied"): + doc = self.parse( + "feature kern {" + " pos [A B] <0 0 0 0> [T Y]' comma a <0 0 0 0>;" + "} kern;" + ) + + def test_gpos_type_1_chained_exception4(self): + with self.assertRaisesRegex(FeatureLibError, "Positioning values are allowed"): + doc = self.parse("feature kern {" " pos a' b c 123 d;" "} kern;") + def test_gpos_type_2_format_a(self): - doc = self.parse("feature kern {" - " pos [T V] -60 [a b c] <1 2 3 4>;" - "} kern;") + doc = self.parse( + "feature kern {" " pos [T V] -60 [a b c] <1 2 3 4>;" "} kern;" + ) pos = doc.statements[0].statements[0] self.assertEqual(type(pos), ast.PairPosStatement) self.assertFalse(pos.enumerated) @@ -883,9 +1022,9 @@ class ParserTest(unittest.TestCase): self.assertEqual(pos.valuerecord2.asFea(), "<1 2 3 4>") def test_gpos_type_2_format_a_enumerated(self): - doc = self.parse("feature kern {" - " enum pos [T V] -60 [a b c] <1 2 3 4>;" - "} kern;") + doc = self.parse( + "feature kern {" " enum pos [T V] -60 [a b c] <1 2 3 4>;" "} kern;" + ) pos = doc.statements[0].statements[0] self.assertEqual(type(pos), ast.PairPosStatement) self.assertTrue(pos.enumerated) @@ -895,9 +1034,9 @@ class ParserTest(unittest.TestCase): self.assertEqual(pos.valuerecord2.asFea(), "<1 2 3 4>") def test_gpos_type_2_format_a_with_null_first(self): - doc = self.parse("feature kern {" - " pos [T V] [a b c] <1 2 3 4>;" - "} kern;") + doc = self.parse( + "feature kern {" " pos [T V] [a b c] <1 2 3 4>;" "} kern;" + ) pos = doc.statements[0].statements[0] self.assertEqual(type(pos), ast.PairPosStatement) self.assertFalse(pos.enumerated) @@ -909,9 +1048,9 @@ class ParserTest(unittest.TestCase): self.assertEqual(pos.asFea(), "pos [T V] [a b c] <1 2 3 4>;") def test_gpos_type_2_format_a_with_null_second(self): - doc = self.parse("feature kern {" - " pos [T V] <1 2 3 4> [a b c] ;" - "} kern;") + doc = self.parse( + "feature kern {" " pos [T V] <1 2 3 4> [a b c] ;" "} kern;" + ) pos = doc.statements[0].statements[0] self.assertEqual(type(pos), ast.PairPosStatement) self.assertFalse(pos.enumerated) @@ -922,9 +1061,7 @@ class ParserTest(unittest.TestCase): self.assertEqual(pos.asFea(), "pos [T V] [a b c] <1 2 3 4>;") def test_gpos_type_2_format_b(self): - doc = self.parse("feature kern {" - " pos [T V] [a b c] <1 2 3 4>;" - "} kern;") + doc = self.parse("feature kern {" " pos [T V] [a b c] <1 2 3 4>;" "} kern;") pos = doc.statements[0].statements[0] self.assertEqual(type(pos), ast.PairPosStatement) self.assertFalse(pos.enumerated) @@ -934,9 +1071,9 @@ class ParserTest(unittest.TestCase): self.assertIsNone(pos.valuerecord2) def test_gpos_type_2_format_b_enumerated(self): - doc = self.parse("feature kern {" - " enumerate position [T V] [a b c] <1 2 3 4>;" - "} kern;") + doc = self.parse( + "feature kern {" " enumerate position [T V] [a b c] <1 2 3 4>;" "} kern;" + ) pos = doc.statements[0].statements[0] self.assertEqual(type(pos), ast.PairPosStatement) self.assertTrue(pos.enumerated) @@ -946,9 +1083,11 @@ class ParserTest(unittest.TestCase): self.assertIsNone(pos.valuerecord2) def test_gpos_type_3(self): - doc = self.parse("feature kern {" - " position cursive A ;" - "} kern;") + doc = self.parse( + "feature kern {" + " position cursive A ;" + "} kern;" + ) pos = doc.statements[0].statements[0] self.assertEqual(type(pos), ast.CursivePosStatement) self.assertEqual(pos.glyphclass.glyphSet(), ("A",)) @@ -962,7 +1101,8 @@ class ParserTest(unittest.TestCase): self.parse, "feature kern {" " enumerate position cursive A ;" - "} kern;") + "} kern;", + ) def test_gpos_type_4(self): doc = self.parse( @@ -973,7 +1113,8 @@ class ParserTest(unittest.TestCase): " position base [a e o u] " " mark @TOP_MARKS " " mark @BOTTOM_MARKS;" - "} test;") + "} test;" + ) pos = doc.statements[-1].statements[0] self.assertEqual(type(pos), ast.MarkBasePosStatement) self.assertEqual(pos.base.glyphSet(), ("a", "e", "o", "u")) @@ -984,21 +1125,24 @@ class ParserTest(unittest.TestCase): def test_gpos_type_4_enumerated(self): self.assertRaisesRegex( FeatureLibError, - '"enumerate" is not allowed with ' - 'mark-to-base attachment positioning', + '"enumerate" is not allowed with ' "mark-to-base attachment positioning", self.parse, "feature kern {" " markClass cedilla @BOTTOM_MARKS;" " enumerate position base A mark @BOTTOM_MARKS;" - "} kern;") + "} kern;", + ) def test_gpos_type_4_not_markClass(self): self.assertRaisesRegex( - FeatureLibError, "@MARKS is not a markClass", self.parse, + FeatureLibError, + "@MARKS is not a markClass", + self.parse, "@MARKS = [acute grave];" "feature test {" " position base [a e o u] mark @MARKS;" - "} test;") + "} test;", + ) def test_gpos_type_5(self): doc = self.parse( @@ -1015,7 +1159,8 @@ class ParserTest(unittest.TestCase): " " " ligComponent " " mark @BOTTOM_MARKS;" - "} test;") + "} test;" + ) pos = doc.statements[-1].statements[0] self.assertEqual(type(pos), ast.MarkLigPosStatement) self.assertEqual(pos.ligatures.glyphSet(), ("a_f_f_i", "o_f_f_i")) @@ -1029,29 +1174,34 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, '"enumerate" is not allowed with ' - 'mark-to-ligature attachment positioning', + "mark-to-ligature attachment positioning", self.parse, "feature test {" " markClass cedilla @MARKS;" " enumerate position " " ligature f_i mark @MARKS" " ligComponent ;" - "} test;") + "} test;", + ) def test_gpos_type_5_not_markClass(self): self.assertRaisesRegex( - FeatureLibError, "@MARKS is not a markClass", self.parse, + FeatureLibError, + "@MARKS is not a markClass", + self.parse, "@MARKS = [acute grave];" "feature test {" " position ligature f_i mark @MARKS;" - "} test;") + "} test;", + ) def test_gpos_type_6(self): doc = self.parse( "markClass damma @MARK_CLASS_1;" "feature test {" " position mark hamza mark @MARK_CLASS_1;" - "} test;") + "} test;" + ) pos = doc.statements[-1].statements[0] self.assertEqual(type(pos), ast.MarkMarkPosStatement) self.assertEqual(pos.baseMarks.glyphSet(), ("hamza",)) @@ -1061,28 +1211,32 @@ class ParserTest(unittest.TestCase): def test_gpos_type_6_enumerated(self): self.assertRaisesRegex( FeatureLibError, - '"enumerate" is not allowed with ' - 'mark-to-mark attachment positioning', + '"enumerate" is not allowed with ' "mark-to-mark attachment positioning", self.parse, "markClass damma @MARK_CLASS_1;" "feature test {" " enum pos mark hamza mark @MARK_CLASS_1;" - "} test;") + "} test;", + ) def test_gpos_type_6_not_markClass(self): self.assertRaisesRegex( - FeatureLibError, "@MARKS is not a markClass", self.parse, + FeatureLibError, + "@MARKS is not a markClass", + self.parse, "@MARKS = [acute grave];" "feature test {" " position mark cedilla mark @MARKS;" - "} test;") + "} test;", + ) def test_gpos_type_8(self): doc = self.parse( "lookup L1 {pos one 100;} L1; lookup L2 {pos two 200;} L2;" "feature test {" " pos [A a] [B b] I' lookup L1 [N n]' lookup L2 P' [Y y] [Z z];" - "} test;") + "} test;" + ) lookup1, lookup2 = doc.statements[0:2] pos = doc.statements[-1].statements[0] self.assertEqual(type(pos), ast.ChainContextPosStatement) @@ -1099,7 +1253,8 @@ class ParserTest(unittest.TestCase): "lookup L1 {pos one 100;} L1;" "feature test {" " pos A' lookup L1 B' 20;" - "} test;") + "} test;", + ) def test_markClass(self): doc = self.parse("markClass [acute grave] @MARKS;") @@ -1110,8 +1265,7 @@ class ParserTest(unittest.TestCase): self.assertEqual((mc.anchor.x, mc.anchor.y), (350, 3)) def test_nameid_windows_utf16(self): - doc = self.parse( - r'table name { nameid 9 "M\00fcller-Lanc\00e9"; } name;') + doc = self.parse(r'table name { nameid 9 "M\00fcller-Lanc\00e9"; } name;') name = doc.statements[0].statements[0] self.assertIsInstance(name, ast.NameRecord) self.assertEqual(name.nameID, 9) @@ -1128,8 +1282,7 @@ class ParserTest(unittest.TestCase): self.assertEqual(name.asFea(), r'nameid 9 "Back\005cslash";') def test_nameid_windows_utf16_quotation_mark(self): - doc = self.parse( - r'table name { nameid 9 "Quotation \0022Mark\0022"; } name;') + doc = self.parse(r'table name { nameid 9 "Quotation \0022Mark\0022"; } name;') name = doc.statements[0].statements[0] self.assertEqual(name.string, 'Quotation "Mark"') self.assertEqual(name.asFea(), r'nameid 9 "Quotation \0022Mark\0022";') @@ -1141,8 +1294,7 @@ class ParserTest(unittest.TestCase): self.assertEqual(name.asFea(), r'nameid 9 "Carrot \d83e\dd55";') def test_nameid_mac_roman(self): - doc = self.parse( - r'table name { nameid 9 1 "Joachim M\9fller-Lanc\8e"; } name;') + doc = self.parse(r'table name { nameid 9 1 "Joachim M\9fller-Lanc\8e"; } name;') name = doc.statements[0].statements[0] self.assertIsInstance(name, ast.NameRecord) self.assertEqual(name.nameID, 9) @@ -1150,12 +1302,10 @@ class ParserTest(unittest.TestCase): self.assertEqual(name.platEncID, 0) self.assertEqual(name.langID, 0) self.assertEqual(name.string, "Joachim Müller-Lancé") - self.assertEqual(name.asFea(), - r'nameid 9 1 "Joachim M\9fller-Lanc\8e";') + self.assertEqual(name.asFea(), r'nameid 9 1 "Joachim M\9fller-Lanc\8e";') def test_nameid_mac_croatian(self): - doc = self.parse( - r'table name { nameid 9 1 0 18 "Jovica Veljovi\e6"; } name;') + doc = self.parse(r'table name { nameid 9 1 0 18 "Jovica Veljovi\e6"; } name;') name = doc.statements[0].statements[0] self.assertEqual(name.nameID, 9) self.assertEqual(name.platformID, 1) @@ -1166,12 +1316,14 @@ class ParserTest(unittest.TestCase): def test_nameid_unsupported_platform(self): self.assertRaisesRegex( - FeatureLibError, "Expected platform id 1 or 3", - self.parse, 'table name { nameid 9 666 "Foo"; } name;') + FeatureLibError, + "Expected platform id 1 or 3", + self.parse, + 'table name { nameid 9 666 "Foo"; } name;', + ) def test_nameid_hexadecimal(self): - doc = self.parse( - r'table name { nameid 0x9 0x3 0x1 0x0409 "Test"; } name;') + doc = self.parse(r'table name { nameid 0x9 0x3 0x1 0x0409 "Test"; } name;') name = doc.statements[0].statements[0] self.assertEqual(name.nameID, 9) self.assertEqual(name.platformID, 3) @@ -1179,8 +1331,7 @@ class ParserTest(unittest.TestCase): self.assertEqual(name.langID, 0x0409) def test_nameid_octal(self): - doc = self.parse( - r'table name { nameid 011 03 012 02011 "Test"; } name;') + doc = self.parse(r'table name { nameid 011 03 012 02011 "Test"; } name;') name = doc.statements[0].statements[0] self.assertEqual(name.nameID, 9) self.assertEqual(name.platformID, 3) @@ -1188,14 +1339,12 @@ class ParserTest(unittest.TestCase): self.assertEqual(name.langID, 0o2011) def test_cv_hexadecimal(self): - doc = self.parse( - r'feature cv01 { cvParameters { Character 0x5DDE; }; } cv01;') + doc = self.parse(r"feature cv01 { cvParameters { Character 0x5DDE; }; } cv01;") cv = doc.statements[0].statements[0].statements[0] self.assertEqual(cv.character, 0x5DDE) def test_cv_octal(self): - doc = self.parse( - r'feature cv01 { cvParameters { Character 056736; }; } cv01;') + doc = self.parse(r"feature cv01 { cvParameters { Character 056736; }; } cv01;") cv = doc.statements[0].statements[0].statements[0] self.assertEqual(cv.character, 0o56736) @@ -1212,8 +1361,7 @@ class ParserTest(unittest.TestCase): doc = self.parse(r"feature test {rsub \1 [\2 \3] \4' \5 by \6;} test;") rsub = doc.statements[0].statements[0] self.assertEqual(type(rsub), ast.ReverseChainSingleSubstStatement) - self.assertEqual(glyphstr(rsub.old_prefix), - "cid00001 [cid00002 cid00003]") + self.assertEqual(glyphstr(rsub.old_prefix), "cid00001 [cid00002 cid00003]") self.assertEqual(rsub.glyphs[0].glyphSet(), ("cid00004",)) self.assertEqual(rsub.replacements[0].glyphSet(), ("cid00006",)) self.assertEqual(glyphstr(rsub.old_suffix), "cid00005") @@ -1222,51 +1370,53 @@ class ParserTest(unittest.TestCase): doc = self.parse( "feature smcp {" " reversesub A B [one.fitted one.oldstyle]' C [d D] by one;" - "} smcp;") + "} smcp;" + ) rsub = doc.statements[0].statements[0] self.assertEqual(type(rsub), ast.ReverseChainSingleSubstStatement) self.assertEqual(glyphstr(rsub.old_prefix), "A B") self.assertEqual(glyphstr(rsub.old_suffix), "C [D d]") - self.assertEqual(mapping(rsub), { - "one.fitted": "one", - "one.oldstyle": "one" - }) + self.assertEqual(mapping(rsub), {"one.fitted": "one", "one.oldstyle": "one"}) def test_rsub_format_c(self): doc = self.parse( "feature test {" " reversesub BACK TRACK [a-d]' LOOK AHEAD by [A.sc-D.sc];" - "} test;") + "} test;" + ) rsub = doc.statements[0].statements[0] self.assertEqual(type(rsub), ast.ReverseChainSingleSubstStatement) self.assertEqual(glyphstr(rsub.old_prefix), "BACK TRACK") self.assertEqual(glyphstr(rsub.old_suffix), "LOOK AHEAD") - self.assertEqual(mapping(rsub), { - "a": "A.sc", - "b": "B.sc", - "c": "C.sc", - "d": "D.sc" - }) + self.assertEqual( + mapping(rsub), {"a": "A.sc", "b": "B.sc", "c": "C.sc", "d": "D.sc"} + ) def test_rsub_from(self): self.assertRaisesRegex( FeatureLibError, 'Reverse chaining substitutions do not support "from"', - self.parse, "feature test {rsub a from [a.1 a.2 a.3];} test;") + self.parse, + "feature test {rsub a from [a.1 a.2 a.3];} test;", + ) def test_rsub_nonsingle(self): self.assertRaisesRegex( FeatureLibError, "In reverse chaining single substitutions, only a single glyph " "or glyph class can be replaced", - self.parse, "feature test {rsub c d by c_d;} test;") + self.parse, + "feature test {rsub c d by c_d;} test;", + ) def test_rsub_multiple_replacement_glyphs(self): self.assertRaisesRegex( FeatureLibError, - 'In reverse chaining single substitutions, the replacement ' + "In reverse chaining single substitutions, the replacement " r'\(after "by"\) must be a single glyph or glyph class', - self.parse, "feature test {rsub f_i by f i;} test;") + self.parse, + "feature test {rsub f_i by f i;} test;", + ) def test_script(self): doc = self.parse("feature test {script cyrl;} test;") @@ -1278,77 +1428,92 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, '"dflt" is not a valid script tag; use "DFLT" instead', - self.parse, "feature test {script dflt;} test;") + self.parse, + "feature test {script dflt;} test;", + ) def test_stat_design_axis(self): # STAT DesignAxis - doc = self.parse('table STAT { DesignAxis opsz 0 ' - '{name "Optical Size";}; } STAT;') + doc = self.parse( + "table STAT { DesignAxis opsz 0 " '{name "Optical Size";}; } STAT;' + ) da = doc.statements[0].statements[0] self.assertIsInstance(da, ast.STATDesignAxisStatement) - self.assertEqual(da.tag, 'opsz') + self.assertEqual(da.tag, "opsz") self.assertEqual(da.axisOrder, 0) - self.assertEqual(da.names[0].string, 'Optical Size') + self.assertEqual(da.names[0].string, "Optical Size") def test_stat_axis_value_format1(self): # STAT AxisValue - doc = self.parse('table STAT { DesignAxis opsz 0 ' - '{name "Optical Size";}; ' - 'AxisValue {location opsz 8; name "Caption";}; } ' - 'STAT;') + doc = self.parse( + "table STAT { DesignAxis opsz 0 " + '{name "Optical Size";}; ' + 'AxisValue {location opsz 8; name "Caption";}; } ' + "STAT;" + ) avr = doc.statements[0].statements[1] self.assertIsInstance(avr, ast.STATAxisValueStatement) - self.assertEqual(avr.locations[0].tag, 'opsz') + self.assertEqual(avr.locations[0].tag, "opsz") self.assertEqual(avr.locations[0].values[0], 8) - self.assertEqual(avr.names[0].string, 'Caption') + self.assertEqual(avr.names[0].string, "Caption") def test_stat_axis_value_format2(self): # STAT AxisValue - doc = self.parse('table STAT { DesignAxis opsz 0 ' - '{name "Optical Size";}; ' - 'AxisValue {location opsz 8 6 10; name "Caption";}; } ' - 'STAT;') + doc = self.parse( + "table STAT { DesignAxis opsz 0 " + '{name "Optical Size";}; ' + 'AxisValue {location opsz 8 6 10; name "Caption";}; } ' + "STAT;" + ) avr = doc.statements[0].statements[1] self.assertIsInstance(avr, ast.STATAxisValueStatement) - self.assertEqual(avr.locations[0].tag, 'opsz') + self.assertEqual(avr.locations[0].tag, "opsz") self.assertEqual(avr.locations[0].values, [8, 6, 10]) - self.assertEqual(avr.names[0].string, 'Caption') + self.assertEqual(avr.names[0].string, "Caption") def test_stat_axis_value_format2_bad_range(self): # STAT AxisValue self.assertRaisesRegex( FeatureLibError, - 'Default value 5 is outside of specified range 6-10.', - self.parse, 'table STAT { DesignAxis opsz 0 ' - '{name "Optical Size";}; ' - 'AxisValue {location opsz 5 6 10; name "Caption";}; } ' - 'STAT;') + "Default value 5 is outside of specified range 6-10.", + self.parse, + "table STAT { DesignAxis opsz 0 " + '{name "Optical Size";}; ' + 'AxisValue {location opsz 5 6 10; name "Caption";}; } ' + "STAT;", + ) def test_stat_axis_value_format4(self): # STAT AxisValue self.assertRaisesRegex( FeatureLibError, - 'Only one value is allowed in a Format 4 Axis Value Record, but 3 were found.', - self.parse, 'table STAT { ' - 'DesignAxis opsz 0 {name "Optical Size";}; ' - 'DesignAxis wdth 0 {name "Width";}; ' - 'AxisValue {' - 'location opsz 8 6 10; ' - 'location wdth 400; ' - 'name "Caption";}; } ' - 'STAT;') + "Only one value is allowed in a Format 4 Axis Value Record, but 3 were found.", + self.parse, + "table STAT { " + 'DesignAxis opsz 0 {name "Optical Size";}; ' + 'DesignAxis wdth 0 {name "Width";}; ' + "AxisValue {" + "location opsz 8 6 10; " + "location wdth 400; " + 'name "Caption";}; } ' + "STAT;", + ) def test_stat_elidedfallbackname(self): # STAT ElidedFallbackName - doc = self.parse('table STAT { ElidedFallbackName {name "Roman"; ' - 'name 3 1 0x0411 "ローマン"; }; ' - '} STAT;') + doc = self.parse( + 'table STAT { ElidedFallbackName {name "Roman"; ' + 'name 3 1 0x0411 "ローマン"; }; ' + "} STAT;" + ) nameRecord = doc.statements[0].statements[0] self.assertIsInstance(nameRecord, ast.ElidedFallbackName) - self.assertEqual(nameRecord.names[0].string, 'Roman') - self.assertEqual(nameRecord.names[1].string, 'ローマン') + self.assertEqual(nameRecord.names[0].string, "Roman") + self.assertEqual(nameRecord.names[1].string, "ローマン") def test_stat_elidedfallbacknameid(self): # STAT ElidedFallbackNameID - doc = self.parse('table name { nameid 278 "Roman"; } name; ' - 'table STAT { ElidedFallbackNameID 278; ' - '} STAT;') + doc = self.parse( + 'table name { nameid 278 "Roman"; } name; ' + "table STAT { ElidedFallbackNameID 278; " + "} STAT;" + ) nameRecord = doc.statements[0].statements[0] self.assertIsInstance(nameRecord, ast.NameRecord) - self.assertEqual(nameRecord.string, 'Roman') + self.assertEqual(nameRecord.string, "Roman") def test_sub_single_format_a(self): # GSUB LookupType 1 doc = self.parse("feature smcp {substitute a by a.sc;} smcp;") @@ -1378,13 +1543,11 @@ class ParserTest(unittest.TestCase): doc = self.parse( "feature smcp {" " substitute [one.fitted one.oldstyle] by one;" - "} smcp;") + "} smcp;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.SingleSubstStatement) - self.assertEqual(mapping(sub), { - "one.fitted": "one", - "one.oldstyle": "one" - }) + self.assertEqual(mapping(sub), {"one.fitted": "one", "one.oldstyle": "one"}) self.assertEqual(glyphstr(sub.prefix), "") self.assertEqual(glyphstr(sub.suffix), "") @@ -1392,45 +1555,35 @@ class ParserTest(unittest.TestCase): doc = self.parse( "feature smcp {" " substitute PRE FIX [one.fitted one.oldstyle]' SUF FIX by one;" - "} smcp;") + "} smcp;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.SingleSubstStatement) - self.assertEqual(mapping(sub), { - "one.fitted": "one", - "one.oldstyle": "one" - }) + self.assertEqual(mapping(sub), {"one.fitted": "one", "one.oldstyle": "one"}) self.assertEqual(glyphstr(sub.prefix), "PRE FIX") self.assertEqual(glyphstr(sub.suffix), "SUF FIX") def test_sub_single_format_c(self): # GSUB LookupType 1 doc = self.parse( - "feature smcp {" - " substitute [a-d] by [A.sc-D.sc];" - "} smcp;") + "feature smcp {" " substitute [a-d] by [A.sc-D.sc];" "} smcp;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.SingleSubstStatement) - self.assertEqual(mapping(sub), { - "a": "A.sc", - "b": "B.sc", - "c": "C.sc", - "d": "D.sc" - }) + self.assertEqual( + mapping(sub), {"a": "A.sc", "b": "B.sc", "c": "C.sc", "d": "D.sc"} + ) self.assertEqual(glyphstr(sub.prefix), "") self.assertEqual(glyphstr(sub.suffix), "") def test_sub_single_format_c_chained(self): # chain to GSUB LookupType 1 doc = self.parse( - "feature smcp {" - " substitute [a-d]' X Y [Z z] by [A.sc-D.sc];" - "} smcp;") + "feature smcp {" " substitute [a-d]' X Y [Z z] by [A.sc-D.sc];" "} smcp;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.SingleSubstStatement) - self.assertEqual(mapping(sub), { - "a": "A.sc", - "b": "B.sc", - "c": "C.sc", - "d": "D.sc" - }) + self.assertEqual( + mapping(sub), {"a": "A.sc", "b": "B.sc", "c": "C.sc", "d": "D.sc"} + ) self.assertEqual(glyphstr(sub.prefix), "") self.assertEqual(glyphstr(sub.suffix), "X Y [Z z]") @@ -1438,14 +1591,18 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, 'Expected a glyph class with 4 elements after "by", ' - 'but found a glyph class with 26 elements', - self.parse, "feature smcp {sub [a-d] by [A.sc-Z.sc];} smcp;") + "but found a glyph class with 26 elements", + self.parse, + "feature smcp {sub [a-d] by [A.sc-Z.sc];} smcp;", + ) def test_sub_with_values(self): self.assertRaisesRegex( FeatureLibError, "Substitution statements cannot contain values", - self.parse, "feature smcp {sub A' 20 by A.sc;} smcp;") + self.parse, + "feature smcp {sub A' 20 by A.sc;} smcp;", + ) def test_substitute_multiple(self): # GSUB LookupType 2 doc = self.parse("lookup Look {substitute f_f_i by f f i;} Look;") @@ -1475,52 +1632,59 @@ class ParserTest(unittest.TestCase): "Direct substitution of multiple glyphs by multiple glyphs " "is not supported", self.parse, - "lookup MxM {sub a b c by d e f;} MxM;") + "lookup MxM {sub a b c by d e f;} MxM;", + ) def test_split_marked_glyphs_runs(self): self.assertRaisesRegex( FeatureLibError, "Unsupported contextual target sequence", - self.parse, "feature test{" - " ignore pos a' x x A';" - "} test;") + self.parse, + "feature test{" " ignore pos a' x x A';" "} test;", + ) self.assertRaisesRegex( FeatureLibError, "Unsupported contextual target sequence", - self.parse, "lookup shift {" - " pos a <0 -10 0 0>;" - " pos A <0 10 0 0>;" - "} shift;" - "feature test {" - " sub a' lookup shift x x A' lookup shift;" - "} test;") + self.parse, + "lookup shift {" + " pos a <0 -10 0 0>;" + " pos A <0 10 0 0>;" + "} shift;" + "feature test {" + " sub a' lookup shift x x A' lookup shift;" + "} test;", + ) self.assertRaisesRegex( FeatureLibError, "Unsupported contextual target sequence", - self.parse, "feature test {" - " ignore sub a' x x A';" - "} test;") + self.parse, + "feature test {" " ignore sub a' x x A';" "} test;", + ) self.assertRaisesRegex( FeatureLibError, "Unsupported contextual target sequence", - self.parse, "lookup upper {" - " sub a by A;" - "} upper;" - "lookup lower {" - " sub A by a;" - "} lower;" - "feature test {" - " sub a' lookup upper x x A' lookup lower;" - "} test;") + self.parse, + "lookup upper {" + " sub a by A;" + "} upper;" + "lookup lower {" + " sub A by a;" + "} lower;" + "feature test {" + " sub a' lookup upper x x A' lookup lower;" + "} test;", + ) def test_substitute_mix_single_multiple(self): - doc = self.parse("lookup Look {" - " sub f_f by f f;" - " sub f by f;" - " sub f_f_i by f f i;" - " sub [a a.sc] by a;" - " sub [a a.sc] by [b b.sc];" - "} Look;") + doc = self.parse( + "lookup Look {" + " sub f_f by f f;" + " sub f by f;" + " sub f_f_i by f f i;" + " sub [a a.sc] by a;" + " sub [a a.sc] by [b b.sc];" + "} Look;" + ) statements = doc.statements[0].statements for sub in statements: self.assertIsInstance(sub, ast.MultipleSubstStatement) @@ -1536,9 +1700,9 @@ class ParserTest(unittest.TestCase): self.assertEqual(statements[6].replacement, ["b.sc"]) def test_substitute_from(self): # GSUB LookupType 3 - doc = self.parse("feature test {" - " substitute a from [a.1 a.2 a.3];" - "} test;") + doc = self.parse( + "feature test {" " substitute a from [a.1 a.2 a.3];" "} test;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.AlternateSubstStatement) self.assertEqual(glyphstr(sub.prefix), "") @@ -1547,9 +1711,9 @@ class ParserTest(unittest.TestCase): self.assertEqual(glyphstr([sub.replacement]), "[a.1 a.2 a.3]") def test_substitute_from_chained(self): # chain to GSUB LookupType 3 - doc = self.parse("feature test {" - " substitute A B a' [Y y] Z from [a.1 a.2 a.3];" - "} test;") + doc = self.parse( + "feature test {" " substitute A B a' [Y y] Z from [a.1 a.2 a.3];" "} test;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.AlternateSubstStatement) self.assertEqual(glyphstr(sub.prefix), "A B") @@ -1558,9 +1722,9 @@ class ParserTest(unittest.TestCase): self.assertEqual(glyphstr([sub.replacement]), "[a.1 a.2 a.3]") def test_substitute_from_cid(self): # GSUB LookupType 3 - doc = self.parse(r"feature test {" - r" substitute \7 from [\111 \222];" - r"} test;") + doc = self.parse( + r"feature test {" r" substitute \7 from [\111 \222];" r"} test;" + ) sub = doc.statements[0].statements[0] self.assertIsInstance(sub, ast.AlternateSubstStatement) self.assertEqual(glyphstr(sub.prefix), "") @@ -1569,17 +1733,18 @@ class ParserTest(unittest.TestCase): self.assertEqual(glyphstr([sub.replacement]), "[cid00111 cid00222]") def test_substitute_from_glyphclass(self): # GSUB LookupType 3 - doc = self.parse("feature test {" - " @Ampersands = [ampersand.1 ampersand.2];" - " substitute ampersand from @Ampersands;" - "} test;") + doc = self.parse( + "feature test {" + " @Ampersands = [ampersand.1 ampersand.2];" + " substitute ampersand from @Ampersands;" + "} test;" + ) [glyphclass, sub] = doc.statements[0].statements self.assertIsInstance(sub, ast.AlternateSubstStatement) self.assertEqual(glyphstr(sub.prefix), "") self.assertEqual(glyphstr([sub.glyph]), "ampersand") self.assertEqual(glyphstr(sub.suffix), "") - self.assertEqual(glyphstr([sub.replacement]), - "[ampersand.1 ampersand.2]") + self.assertEqual(glyphstr([sub.replacement]), "[ampersand.1 ampersand.2]") def test_substitute_ligature(self): # GSUB LookupType 4 doc = self.parse("feature liga {substitute f f i by f_f_i;} liga;") @@ -1609,13 +1774,15 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, 'Expected "by", "from" or explicit lookup references', - self.parse, "feature liga {substitute f f i;} liga;") - + self.parse, + "feature liga {substitute f f i;} liga;", + ) + def test_substitute_invalid_statement(self): self.assertRaisesRegex( FeatureLibError, "Invalid substitution statement", - Parser(self.getpath("GSUB_error.fea"), GLYPHNAMES).parse + Parser(self.getpath("GSUB_error.fea"), GLYPHNAMES).parse, ) def test_subtable(self): @@ -1625,8 +1792,11 @@ class ParserTest(unittest.TestCase): def test_table_badEnd(self): self.assertRaisesRegex( - FeatureLibError, 'Expected "GDEF"', self.parse, - "table GDEF {LigatureCaretByPos f_i 400;} ABCD;") + FeatureLibError, + 'Expected "GDEF"', + self.parse, + "table GDEF {LigatureCaretByPos f_i 400;} ABCD;", + ) def test_table_comment(self): for table in "BASE GDEF OS/2 head hhea name vhea".split(): @@ -1637,8 +1807,11 @@ class ParserTest(unittest.TestCase): def test_table_unsupported(self): self.assertRaisesRegex( - FeatureLibError, '"table Foo" is not supported', self.parse, - "table Foo {LigatureCaretByPos f_i 400;} Foo;") + FeatureLibError, + '"table Foo" is not supported', + self.parse, + "table Foo {LigatureCaretByPos f_i 400;} Foo;", + ) def test_valuerecord_format_a_horizontal(self): doc = self.parse("feature liga {valueRecordDef 123 foo;} liga;") @@ -1702,12 +1875,13 @@ class ParserTest(unittest.TestCase): def test_valuerecord_format_a_vertical_contexts_(self): for tag in "vkrn vpal vhal valt".split(): - doc = self.parse( - "feature %s {valueRecordDef 77 foo;} %s;" % (tag, tag)) + doc = self.parse("feature %s {valueRecordDef 77 foo;} %s;" % (tag, tag)) value = doc.statements[0].statements[0].value if value.yAdvance != 77: - self.fail(msg="feature %s should be a vertical context " - "for ValueRecord format A" % tag) + self.fail( + msg="feature %s should be a vertical context " + "for ValueRecord format A" % tag + ) def test_valuerecord_format_b(self): doc = self.parse("feature liga {valueRecordDef <1 2 3 4> foo;} liga;") @@ -1749,7 +1923,8 @@ class ParserTest(unittest.TestCase): " " " " " > foo;" - "} liga;") + "} liga;" + ) value = doc.statements[0].statements[0].value self.assertEqual(value.xPlacement, 1) self.assertEqual(value.yPlacement, 2) @@ -1759,9 +1934,11 @@ class ParserTest(unittest.TestCase): self.assertEqual(value.yPlaDevice, ((11, 111), (12, 112))) self.assertIsNone(value.xAdvDevice) self.assertEqual(value.yAdvDevice, ((33, -113), (44, -114), (55, 115))) - self.assertEqual(value.asFea(), - "<1 2 3 4 " - " >") + self.assertEqual( + value.asFea(), + "<1 2 3 4 " + " >", + ) def test_valuerecord_format_d(self): doc = self.parse("feature test {valueRecordDef foo;} test;") @@ -1769,9 +1946,21 @@ class ParserTest(unittest.TestCase): self.assertFalse(value) self.assertEqual(value.asFea(), "") + def test_valuerecord_variable_scalar(self): + doc = self.parse( + "feature test {valueRecordDef <0 (wght=200:-100 wght=900:-150 wdth=150,wght=900:-120) 0 0> foo;} test;" + ) + value = doc.statements[0].statements[0].value + self.assertEqual( + value.asFea(), + "<0 (wght=200:-100 wght=900:-150 wdth=150,wght=900:-120) 0 0>", + ) + def test_valuerecord_named(self): - doc = self.parse("valueRecordDef <1 2 3 4> foo;" - "feature liga {valueRecordDef bar;} liga;") + doc = self.parse( + "valueRecordDef <1 2 3 4> foo;" + "feature liga {valueRecordDef bar;} liga;" + ) value = doc.statements[1].statements[0].value self.assertEqual(value.xPlacement, 1) self.assertEqual(value.yPlacement, 2) @@ -1780,8 +1969,11 @@ class ParserTest(unittest.TestCase): def test_valuerecord_named_unknown(self): self.assertRaisesRegex( - FeatureLibError, "Unknown valueRecordDef \"unknown\"", - self.parse, "valueRecordDef foo;") + FeatureLibError, + 'Unknown valueRecordDef "unknown"', + self.parse, + "valueRecordDef foo;", + ) def test_valuerecord_scoping(self): [foo, liga, smcp] = self.parse( @@ -1795,10 +1987,49 @@ class ParserTest(unittest.TestCase): def test_valuerecord_device_value_out_of_range(self): self.assertRaisesRegex( - FeatureLibError, r"Device value out of valid range \(-128..127\)", + FeatureLibError, + r"Device value out of valid range \(-128..127\)", self.parse, "valueRecordDef <1 2 3 4 " - " > foo;") + " > foo;", + ) + + def test_conditionset(self): + doc = self.parse("conditionset heavy { wght 700 900; } heavy;") + value = doc.statements[0] + self.assertEqual(value.conditions["wght"], (700, 900)) + self.assertEqual( + value.asFea(), "conditionset heavy {\n wght 700 900;\n} heavy;\n" + ) + + doc = self.parse("conditionset heavy { wght 700 900; opsz 17 18;} heavy;") + value = doc.statements[0] + self.assertEqual(value.conditions["wght"], (700, 900)) + self.assertEqual(value.conditions["opsz"], (17, 18)) + self.assertEqual( + value.asFea(), + "conditionset heavy {\n wght 700 900;\n opsz 17 18;\n} heavy;\n", + ) + + def test_conditionset_same_axis(self): + self.assertRaisesRegex( + FeatureLibError, + r"Repeated condition for axis wght", + self.parse, + "conditionset heavy { wght 700 900; wght 100 200; } heavy;", + ) + + def test_conditionset_float(self): + doc = self.parse("conditionset heavy { wght 700.0 900.0; } heavy;") + value = doc.statements[0] + self.assertEqual(value.conditions["wght"], (700.0, 900.0)) + self.assertEqual( + value.asFea(), "conditionset heavy {\n wght 700.0 900.0;\n} heavy;\n" + ) + + def test_variation(self): + doc = self.parse("variation rvrn heavy { sub a by b; } rvrn;") + value = doc.statements[0] def test_languagesystem(self): [langsys] = self.parse("languagesystem latn DEU;").statements @@ -1810,20 +2041,30 @@ class ParserTest(unittest.TestCase): self.assertRaisesRegex( FeatureLibError, '"dflt" is not a valid script tag; use "DFLT" instead', - self.parse, "languagesystem dflt dflt;") + self.parse, + "languagesystem dflt dflt;", + ) self.assertRaisesRegex( FeatureLibError, '"DFLT" is not a valid language tag; use "dflt" instead', - self.parse, "languagesystem latn DFLT;") + self.parse, + "languagesystem latn DFLT;", + ) self.assertRaisesRegex( - FeatureLibError, "Expected ';'", - self.parse, "languagesystem latn DEU") + FeatureLibError, "Expected ';'", self.parse, "languagesystem latn DEU" + ) self.assertRaisesRegex( - FeatureLibError, "longer than 4 characters", - self.parse, "languagesystem foobar DEU;") + FeatureLibError, + "longer than 4 characters", + self.parse, + "languagesystem foobar DEU;", + ) self.assertRaisesRegex( - FeatureLibError, "longer than 4 characters", - self.parse, "languagesystem latn FOOBAR;") + FeatureLibError, + "longer than 4 characters", + self.parse, + "languagesystem latn FOOBAR;", + ) def test_empty_statement_ignored(self): doc = self.parse("feature test {;} test;") @@ -1869,4 +2110,5 @@ class SymbolTableTest(unittest.TestCase): if __name__ == "__main__": import sys + sys.exit(unittest.main()) diff --git a/Tests/merge/data/CFFFont1.ttx b/Tests/merge/data/CFFFont1.ttx new file mode 100644 index 00000000..33f8cc6f --- /dev/null +++ b/Tests/merge/data/CFFFont1.ttx @@ -0,0 +1,23445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copyright 2015-2021 The Aref Ruqaa Project Authors (https://github.com/aliftype/aref-ruqaa), with Reserved Font Name EURM10. + + + Aref Ruqaa + + + Regular + + + 1.003;ALIF;ArefRuqaa-Regular + + + Aref Ruqaa Regular + + + Version 1.003 + + + ArefRuqaa-Regular + + + Abdullah Aref + + + Aref Ruqaa is an Arabic typeface that aspires to capture the essence of the classical Ruqaa calligraphic style. + + + This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFL + + + https://scripts.sil.org/OFL + + + الحب سماء لا تمطر غير الأحلام + + + Looped Haa + + + Open final Haa + + + Tailed Noon + + + Looped initial Kaf + + + Alternate Arabic digit two + + + Tailed Sheen + + + Alternate Sad-Tah/Tah-Sad + + + Alternate Sukun + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + return + + + rrcurveto + -1 vlineto + return + + + rrcurveto + -104 callgsubr + return + + + rmoveto + -21 37 -26 39 -32 38 -8 -14 -7 -14 -7 -15 33 -40 34 -41 18 -54 rrcurveto + -1 0 0 1 14 3 23 9 4 vhcurveto + 17 39 18 35 27 31 rrcurveto + 13 3 14 4 14 vhcurveto + -3 hlineto + -27 -35 -25 -36 -20 -42 rrcurveto + return + + + -21 25 -85 callsubr + -31 -6 return + + + 10 -28 23 -60 -2 -33 return + + + 74 117 -22 321 rlineto + return + + + 0 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -7 -72 -16 -80 -8 -80 -6 -157 -2 -120 36 -85 9 callsubr + 42 90 28 90 28 86 14 82 3 53 113 26 callgsubr + -114 -57 -80 -102 -79 -101 return + + + -123 92 -100 43 -47 76 -30 109 -14 return + + + 21 -25 57 -8 vhcurveto + -3 return + + + -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 return + + + -158 -2 -120 return + + + rmoveto + 14 -40 18 -55 -1 -26 -50 -22 -89 -24 -60 -11 -74 -133 rcurveline + 56 15 105 22 46 24 29 15 25 22 21 24 rrcurveto + 122 145 -85 158 0 vvcurveto + endchar + + + -79 -9 -6 -149 36 -62 28 -46 35 -71 -8 -75 4 3 2 3 1 4 12 45 22 44 -7 54 -15 56 -38 58 -20 51 return + + + 22 callsubr + 11 17 return + + + rmoveto + 60 119 -64 -12 -64 -12 -64 -12 rlinecurve + -60 -119 64 12 64 12 64 12 rlinecurve + return + + + 1 -29 27 -14 28 -3 return + + + 9 -24 9 -24 -3 -16 -16 -7 return + + + 35 -8 50 rrcurveto + endchar + + + 1 2 0 1 1 vvcurveto + 3 -3 return + + + -13 -35 -13 -42 -13 -50 1 return + + + 2 2 2 rrcurveto + endchar + + + -17 20 -24 7 -31 -6 return + + + 242 16 rmoveto + 13 15 1 3 16 hvcurveto + 40 6 62 17 33 9 40 15 37 18 34 22 61 39 39 50 34 66 rrcurveto + 6 11 2 11 11 vvcurveto + 37 -32 33 -38 -38 -36 -17 -16 -17 vhcurveto + -64 -60 -59 -64 -57 -67 -19 -4 -20 -3 -23 -2 -1 1 rcurveline + 14 32 10 23 5 16 rrcurveto + 1 2 0 4 6 vvcurveto + 4 0 1 -1 -1 -1 -1 46 callsubr + -29 -16 -77 -13 -124 -8 -22 -132 rcurveline + 54 5 109 20 41 17 rrcurveto + -1 -3 0 -3 -3 vvcurveto + -15 20 -2 19 vhcurveto + 331 197 rmoveto + -5 -2 -3 -4 -2 vhcurveto + -57 -28 -67 -14 -71 -14 36 36 34 41 47 25 rrcurveto + 5 8 10 1 9 hhcurveto + 29 28 -17 -25 hvcurveto + endchar + + + 197 504 rmoveto + 21 -320 74 117 -21 321 rlineto + 198 -249 rmoveto + -38 -36 -67 callsubr + -59 -65 -58 -66 -27 -6 -59 -7 -90 -7 -106 callsubr + -21 -128 rlineto + 2 1 0 1 2 hvcurveto + -1 vlineto + 81 8 88 17 94 28 94 28 72 47 50 67 17 22 15 25 14 28 rrcurveto + 6 11 3 11 11 vvcurveto + 36 -32 34 -38 vhcurveto + -31 -152 rmoveto + -5 -2 -4 -4 -2 vhcurveto + 90 callgsubr + 38 47 26 rrcurveto + 5 8 9 2 9 hhcurveto + 29 29 -17 -25 hvcurveto + endchar + + + rmoveto + 40 48 31 79 0 vvcurveto + 8 28 0 14 -3 42 -46 callgsubr + 63 -7 callsubr + -117 rcurveline + -60 -95 rlineto + 7 -100 12 -101 -102 vvcurveto + -182 -92 -155 -29 -72 84 -47 54 30 58 46 83 -11 -3 -11 -8 -5 -8 -75 -115 -15 -81 11 -52 13 -59 43 -44 81 -8 130 -13 145 75 70 84 rrcurveto + endchar + + + 619 342 -31 callsubr + return + + + -31 callsubr + endchar + + + 217 167 -71 callgsubr + + + -87 callsubr + -29 27 -15 28 -3 return + + + 59 23 35 13 35 2 34 2 34 -18 26 -39 19 return + + + 68 callgsubr + endchar + + + -74 callgsubr + 10 -22 -20 return + + + -6 7 -6 7 -2 7 4 8 11 24 14 return + + + 15 35 15 35 11 30 7 23 rrcurveto + 1 2 return + + + -2 -53 callgsubr + 15 return + + + -63 -108 -63 -32 -117 rcurveline + -60 return + + + -110 -64 -87 -48 -110 -64 return + + + -2 -3 -3 -3 -6 -3 return + + + -232 rcurveline + -1 -15 -1 return + + + -17 -16 -17 hvcurveto + -64 -60 return + + + 1 2 3 8 7 13 12 return + + + rmoveto + -24 -26 -16 -32 -27 hvcurveto + return + + + 10 -112 -102 vvcurveto + endchar + + + -4 -15 hvcurveto + -6 -5 return + + + 4 8 -9 1 -3 return + + + 19 46 25 74 40 return + + + 26 -21 25 -17 20 return + + + -22 -41 -10 -19 -1 return + + + 1 9 -4 3 -8 -5 return + + + 38 23 hvcurveto + 23 38 12 return + + + -20 -34 -20 -34 return + + + 371 46 rmoveto + -1 -3 -1 -2 -3 vvcurveto + -13 12 -7 24 vhcurveto + 4 hlineto + 32 1 32 4 32 7 52 10 49 18 48 23 75 37 53 62 40 77 66 callgsubr + -38 -35 -17 -16 -17 vhcurveto + -64 -60 -59 -64 -58 -66 rrcurveto + -1 -1 -1 -1 hhcurveto + -1 vlineto + -1 -6 -14 -1 -10 hhcurveto + -8 -6 1 3 -5 hvcurveto + 15 33 9 23 5 15 rrcurveto + 1 2 0 4 6 vvcurveto + 4 -1 2 -1 -1 -1 -2 -2 -2 vhcurveto + -16 -38 -49 -20 -46 -12 rrcurveto + -10 -35 -68 -12 -49 hhcurveto + -10 hlineto + -30 1 -26 5 -23 10 rrcurveto + -25 11 -12 20 31 vvcurveto + 30 13 41 25 50 -95 callgsubr + 2 -1 1 -1 vhcurveto + -2 hlineto + -2 -2 -1 -2 -1 hvcurveto + -16 -22 -23 -41 -32 -62 rrcurveto + -21 -41 -11 -37 -32 vvcurveto + -80 60 -17 81 80 98 22 23 53 vhcurveto + 358 162 rmoveto + -5 -2 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 34 39 47 26 rrcurveto + 5 8 10 1 9 hhcurveto + 29 28 -17 -25 hvcurveto + endchar + + + 590 306 rmoveto + -7 5 -7 8 -7 5 -20 12 -17 2 -17 -8 -44 -23 -34 -33 -38 -29 -40 -31 -80 -49 -56 -19 rrcurveto + -10 -29 -29 -5 -27 hhcurveto + -27 -20 16 32 -14 hvcurveto + -14 32 12 55 39 76 28 callsubr + -11 -15 -16 -26 -21 -36 -21 -36 -15 -37 -10 -37 -8 -31 -3 -47 13 -29 rrcurveto + -35 15 25 -17 35 hhcurveto + 35 33 5 12 29 hvcurveto + 43 18 38 22 33 28 33 28 33 26 35 25 10 7 10 9 10 9 13 12 31 17 22 -14 18 -15 3 -5 36 3 26 1 26 5 25 9 75 28 71 48 55 44 rrcurveto + 38 31 27 31 17 31 13 25 11 26 9 30 9 30 -7 26 -24 21 -44 37 -75 -44 -20 -26 -53 -69 -48 -74 -46 -75 -11 -4 -12 -5 -11 -4 rrcurveto + -1 -7 -5 -2 -3 hhcurveto + 266 142 rmoveto + 9 -12 1 -10 -7 -5 -53 -37 -65 -25 -65 -24 30 43 28 43 41 33 24 18 41 -4 16 -20 rrcurveto + endchar + + + 496 315 rmoveto + -50 3 -55 -23 -62 -48 -62 -48 -44 -42 -27 -35 -105 callgsubr + 17 21 18 19 18 19 37 38 64 48 52 12 rrcurveto + 1 hlineto + 35 13 24 -7 13 -29 46 callgsubr + 52 60 41 79 12 callgsubr + -63 -57 -67 -23 -5 -14 6 -2 17 rrcurveto + 17 -2 -12 9 -21 hhcurveto + 310 43 -13 callsubr + + + 274 37 rmoveto + -5 -15 6 -10 18 -1 60 -5 78 28 45 14 40 15 37 -17 callsubr + -57 -66 -4 -1 -9 -1 -14 -3 -21 -5 rcurveline + 15 33 9 24 5 15 rrcurveto + 1 1 0 4 6 vvcurveto + 6 -1 2 -4 -5 vhcurveto + -9 -22 -14 -16 -20 -11 -27 -15 -34 -10 -41 -3 -41 -3 -28 -3 -17 -1 rrcurveto + -1 hlineto + -55 3 -31 16 -8 28 -13 -35 -13 -44 -13 -49 1 -15 6 -11 11 -7 26 -17 27 1 46 1 48 7 72 14 37 16 rrcurveto + 349 188 39 callgsubr + 33 38 47 26 29 15 40 -14 11 -20 rrcurveto + endchar + + + 430 223 rmoveto + 6 -2 2 -4 -5 vhcurveto + -9 -22 -14 -17 -19 -11 -15 -8 -25 -9 -35 -10 -70 -20 -176 -33 -22 80 -101 callgsubr + 94 -9 116 28 67 28 -5 -15 9 -9 20 -2 rrcurveto + 20 -2 23 1 27 4 33 5 59 12 24 8 40 15 38 -17 callsubr + -58 -66 -13 -3 -31 -4 -11 7 6 15 5 13 5 11 rrcurveto + 6 15 8 10 19 vvcurveto + 260 5 39 callgsubr + 34 38 47 26 29 15 39 -14 11 -20 rrcurveto + endchar + + + 411 254 rmoveto + -14 -11 -22 -11 -28 -11 -28 -11 -12 10 4 33 1 7 -4 5 -9 1 -35 4 -33 -6 -32 -14 -32 -14 -29 -19 -26 -22 -19 -16 -22 -26 -24 -37 73 callgsubr + 24 35 19 25 12 16 rlinecurve + 12 16 21 17 32 21 26 17 56 34 -6 -53 -4 -34 15 -13 32 6 32 6 23 6 15 7 rrcurveto + 5 9 6 3 2 hhcurveto + -4 1 2 -3 33 callsubr + 66 7 67 rrcurveto + 1 -1 1 -1 -1 vhcurveto + -1 -1 -2 -2 -3 vvcurveto + -12 -46 -31 -27 -49 -9 rrcurveto + 5 16 1 18 19 vvcurveto + -1 5 0 1 -3 -5 -8 -14 -6 -21 -12 -9 rrcurveto + endchar + + + 462 574 rmoveto + 21 -321 74 118 -21 320 rlineto + 258 -279 rmoveto + 9 30 -8 25 -24 21 -44 37 -74 -43 -20 -26 -53 -69 -49 -73 -45 -76 -38 -15 -47 -19 -57 -22 -57 -22 -53 -13 -49 -5 -49 -5 -37 10 -26 24 -26 24 0 51 24 78 rrcurveto + 4 1 -1 2 -3 hhcurveto + -3 -2 -1 -2 -1 hvcurveto + -8 -16 -11 -27 -14 -36 -23 -59 -22 -83 27 -65 12 -28 27 -14 43 1 45 1 56 10 67 19 138 40 141 66 106 75 86 61 32 45 30 95 rrcurveto + -90 -49 rmoveto + 10 -12 1 -9 -8 -5 -52 -37 -66 -26 -66 -24 30 43 28 44 41 32 24 18 42 -3 16 -21 rrcurveto + endchar + + + 368 242 rmoveto + -9 vlineto + -32 -29 -40 -24 -48 -19 rrcurveto + -12 -31 -33 -6 -35 hhcurveto + -20 -21 2 4 -21 hvcurveto + -35 15 -17 21 29 vvcurveto + 10 2 12 5 12 vhcurveto + 18 49 20 40 18 40 74 -50 rcurveline + 16 28 0 1 16 28 11 19 10 19 11 20 -27 18 -26 18 -27 18 -15 8 rcurveline + -17 -29 -21 -36 -16 -30 rrcurveto + -59 -107 -28 -85 -62 vvcurveto + -71 26 -49 42 -20 vhcurveto + -9 19 21 -6 23 hhcurveto + 24 27 6 10 29 hvcurveto + 56 21 46 36 37 53 37 54 25 61 12 68 rrcurveto + 4 19 1 20 19 vvcurveto + 47 -11 45 -21 44 vhcurveto + -54 -125 rlineto + 13 -42 12 -40 -54 vvcurveto + endchar + + + 317 499 rmoveto + 22 -321 -101 callsubr + -352 -440 rmoveto + -101 callgsubr + 44 -4 54 3 64 11 64 11 63 14 62 18 40 15 37 18 34 22 61 39 38 51 34 65 14 28 -3 26 -21 25 rrcurveto + -85 callsubr + -31 -6 -24 -10 -15 -15 -64 -60 -59 -63 -58 -67 -34 -8 -46 -3 -36 -2 rrcurveto + -1 hlineto + -67 -6 -81 3 -14 48 rrcurveto + 515 55 -99 callgsubr + -8 -8 -4 -57 -27 -67 -15 -71 -13 36 36 34 30 callsubr + + + 375 514 rmoveto + 21 -321 -101 callsubr + 260 -352 rmoveto + 14 28 -2 -60 callsubr + -25 8 -31 -6 -31 -6 -24 -10 -15 -15 -64 -60 -60 -63 -57 -67 -38 -8 -37 -7 -39 -6 -49 -8 -47 -3 -46 3 -46 3 -26 14 -8 28 rrcurveto + -66 callgsubr + 95 -9 212 44 71 23 46 15 42 19 40 23 67 40 43 53 36 70 rrcurveto + -97 -33 16 callsubr + 34 40 47 25 -60 callgsubr + + + 217 135 rmoveto + 27 -36 18 -24 33 3 49 27 rlinecurve + 5 9 4 2 2 hhcurveto + -5 1 3 -2 67 callgsubr + 65 7 68 -2 6 -2 -2 -2 -9 -11 -46 -31 -28 -50 -9 5 19 2 18 -1 17 rrcurveto + 6 -1 0 -3 -6 vhcurveto + -8 -14 -6 -21 -12 -9 -50 -38 -26 -11 -5 15 -5 15 -14 15 -22 13 -28 16 -27 2 -27 -10 -27 -10 -26 -17 -24 -24 -44 -44 -44 -71 -29 -56 rrcurveto + -2 vlineto + 9 -44 29 42 34 41 40 37 rlinecurve + 40 37 35 5 30 -27 rrcurveto + endchar + + + 290 657 rmoveto + 22 -321 73 118 -22 321 rlineto + 206 -434 rmoveto + 17 22 16 26 17 30 17 30 -1 28 -103 callsubr + -24 -10 -16 -14 -64 -60 -59 -64 -57 -67 -76 -17 -65 -35 -51 -56 -51 -56 -33 -63 -15 -70 -105 callsubr + 35 55 40 39 49 24 96 47 107 26 100 42 50 21 43 35 37 50 rrcurveto + -43 49 rmoveto + 7 -14 0 -92 callgsubr + 37 34 39 47 26 29 16 39 -17 11 -19 rrcurveto + endchar + + + 351 308 rmoveto + -18 255 -74 -110 18 -262 rlineto + 250 189 rmoveto + -38 -35 -67 callsubr + -59 -64 -58 -66 -27 -6 -79 -10 -129 -12 -106 callsubr + -21 -128 123 13 109 20 94 28 rlinecurve + 94 28 72 46 50 67 17 22 16 25 14 28 5 callgsubr + 34 39 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 138 87 rmoveto + -22 -18 -47 -17 -29 -10 -7 -17 rcurveline + 98 -25 18 25 24 42 11 32 rlinecurve + 12 30 6 31 33 vvcurveto + 9 vlineto + -1 36 -9 33 -14 29 45 callsubr + -7 2 -7 hhcurveto + -11 -11 -6 -14 -10 hvcurveto + -27 -36 -19 -47 -22 -41 rrcurveto + -5 -9 -2 -10 -13 vvcurveto + -2 vlineto + -25 1 19 -10 24 hhcurveto + 25 23 14 11 13 hvcurveto + 1 1 1 0 1 hhcurveto + 6 5 -13 -24 7 hvcurveto + 8 -29 4 -17 1 -4 rrcurveto + -1 -2 0 -1 -2 vvcurveto + endchar + + + 297 145 rmoveto + 57 16 46 30 35 44 35 44 27 49 20 54 -96 callgsubr + -48 -56 -42 -68 -37 -83 -37 -7 -34 -8 -29 -10 -54 -18 -41 -56 -25 -55 rrcurveto + 87 callgsubr + 25 55 39 35 54 15 54 15 53 13 51 12 rrcurveto + 98 238 51 callgsubr + -24 -12 -24 -6 -22 -72 callsubr + 28 31 11 rrcurveto + endchar + + + -21 callgsubr + endchar + + + rmoveto + 157 -86 273 169 84 130 26 39 7 38 -25 27 -18 19 -33 -1 -28 8 -160 45 117 73 49 -15 20 32 11 39 17 36 rrcurveto + 9 4 -14 1 -4 hhcurveto + -35 -1 -28 -29 -19 -18 -42 -40 -83 -134 16 -56 15 -54 64 -20 67 -7 -60 -39 -69 -30 -83 -15 -69 -13 -90 2 -45 35 -103 81 104 151 39 81 -62 callsubr + -5 rrcurveto + -67 -94 -160 -272 173 -95 rrcurveto + endchar + + + 438 500 rmoveto + 15 -167 -48 -12 -49 -26 -50 -42 rlinecurve + -50 -42 -37 -35 -23 -31 -52 -67 -42 -79 -39 -78 -1 -3 rcurveline + -8 -15 4 29 rlineto + 2 vlineto + -53 -66 -3 -39 63 callgsubr + 6 -17 13 12 19 40 29 58 23 55 15 36 15 36 27 42 40 47 17 21 18 18 18 19 45 47 20 9 64 45 34 24 28 10 24 -6 22 -237 rcurveline + 71 return + + + 402 251 rmoveto + 20 18 15 18 11 17 19 29 8 29 8 40 5 25 -13 13 -31 1 -31 1 -22 0 -12 -4 rrcurveto + -10 -10 -8 -14 -10 hvcurveto + -23 -33 -18 -48 -18 -38 -7 -2 -6 -1 -7 -3 -57 -22 -70 -15 -44 -32 -60 -43 -19 -78 -20 -96 -105 callsubr + 16 30 23 27 29 22 36 27 65 28 53 20 62 23 60 31 46 41 rrcurveto + endchar + + + -24 150 rmoveto + -5 -11 -6 -12 -5 -11 1 -6 2 -7 2 -5 14 -38 20 -33 2 -50 rrcurveto + -8 vlineto + -11 -1 -12 -2 -13 vhcurveto + -1 -1 0 0 vhcurveto + -1 1 -2 1 vhcurveto + 1 hlineto + 2 0 1 2 2 hvcurveto + 17 19 10 22 31 vvcurveto + 2 vlineto + 13 -2 12 -3 13 vhcurveto + -10 38 -18 35 -13 35 rrcurveto + 2 -1 -1 1 -2 hhcurveto + -1 hlineto + -3 -1 -1 -1 -3 vvcurveto + endchar + + + 475 468 rmoveto + 3 13 -1 18 -19 2 -36 4 -46 9 -22 -20 -18 -17 -3 -1 -52 -115 -70 -18 rcurveline + -73 -20 -60 -19 -34 -52 rrcurveto + -25 -56 -16 -71 -73 vvcurveto + 1 -146 43 -124 19 -140 16 56 6 77 -8 66 -42 261 rcurveline + -7 43 31 18 26 14 65 35 91 9 65 33 96 49 46 47 24 118 rrcurveto + endchar + + + rmoveto + -2 3 -24 78 2 78 -3 101 rlinecurve + -1 23 -11 19 -18 9 -18 10 -21 -10 -10 -11 -27 -29 -95 -155 64 -29 37 -17 38 26 17 24 1 -87 11 -58 20 -70 rrcurveto + -99 276 rmoveto + -4 4 -2 5 3 5 8 15 7 18 24 -3 13 -3 10 -17 3 -11 rrcurveto + -1 5 -9 -2 hhcurveto + -16 -12 -32 -4 -16 12 rrcurveto + endchar + + + 346 234 rmoveto + -82 -35 -57 -46 -34 -55 -34 -55 -37 -68 -39 -78 -9 -18 rcurveline + 4 30 rlineto + -23 callsubr + 26 52 22 55 23 54 22 52 29 48 35 43 13 15 19 13 25 11 78 33 52 58 22 86 8 30 5 39 -2 39 return + + + rmoveto + 12 26 11 29 9 29 rrcurveto + 1 -2 4 -1 vhcurveto + -34 69 -8 113 15 96 -69 -2 -54 17 -44 25 -8 -24 -12 -27 -9 -24 -2 -5 -1 -9 6 -3 41 -22 47 -15 61 -1 rrcurveto + -6 -1 -11 -1 -5 vhcurveto + -10 -98 17 -89 28 -69 1 -3 7 1 1 3 rrcurveto + endchar + + + rmoveto + 13 -34 19 -64 -1 -23 rrcurveto + 0 -194 -97 -150 -87 -79 31 85 4 vhcurveto + 3 60 37 57 8 15 4 8 -8 5 -11 -16 rrcurveto + -54 -81 -37 -81 -55 vvcurveto + -165 178 14 11 166 205 106 108 53 vhcurveto + 60 120 -63 121 0 vvcurveto + return + + + 276 501 rmoveto + 4 -52 -4 callgsubr + return + + + 116 137 rmoveto + -58 -61 rlineto + -20 vlineto + 42 -14 21 -26 -86 callgsubr + 22 20 -57 callsubr + 37 -87 callgsubr + return + + + -29 -14 -47 -16 -65 -18 rlinecurve + -18 -65 -62 -10 -58 hhcurveto + -1 hlineto + -57 -44 14 28 -30 hvcurveto + -13 12 -7 17 22 vvcurveto + 28 11 37 22 44 vhcurveto + 1 2 0 0 1 vvcurveto + 3 -3 1 -2 vhcurveto + endchar + + + 448 272 rmoveto + -1 7 -9 1 -3 -8 -16 -35 -23 -28 -30 -20 -64 -43 -79 -27 -81 -25 -236 -73 96 -17 156 -4 101 -3 67 33 45 54 31 37 33 84 13 67 rrcurveto + return + + + rmoveto + -1 -1 -1 -1 -1 vvcurveto + -2 1 -3 2 -1 vhcurveto + 59 -49 rlineto + -1 1 2 -1 1 hhcurveto + 2 1 1 2 1 hvcurveto + 52 63 rlineto + 2 2 1 1 2 vvcurveto + 1 -2 2 -2 2 vhcurveto + -58 return + + + 91 77 rmoveto + -22 -13 -37 -14 -25 -8 -7 -17 rcurveline + 98 -25 27 36 19 38 10 40 rlinecurve + 9 35 5 36 -2 37 -17 290 rcurveline + -74 -117 6 -97 9 -119 1 -102 rlinecurve + endchar + + + 79 75 -3 callsubr + -65 vmoveto + 1 callsubr + endchar + + + -81 callgsubr + 44 callsubr + return + + + 60 29 52 91 4 hvcurveto + 8 -8 6 -7 -7 vhcurveto + -103 -99 8 172 23 85 17 64 9 37 2 10 -31 -30 rcurveline + -33 -94 -28 -95 -7 -72 rrcurveto + -77 -8 32 -51 41 hhcurveto + return + + + rmoveto + -3 -4 0 -5 4 -3 72 -70 rcurveline + 4 -3 6 -1 3 4 88 92 rcurveline + 3 4 1 5 -4 3 -73 70 rcurveline + -4 3 -5 1 -3 -4 rrcurveto + endchar + + + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 return + + + 11 76 rmoveto + 6 5 5 9 7 hvcurveto + 12 12 25 10 37 10 rrcurveto + 1 vlineto + 42 9 39 11 36 14 32 12 23 22 17 33 20 -224 rcurveline + return + + + vhcurveto + -5 28 -4 29 27 callsubr + 4 5 callsubr + return + + + 18 34 22 61 39 38 50 34 66 14 28 -3 26 -103 callsubr + -24 -10 -15 -14 rrcurveto + -64 -60 -59 -65 return + + + 287 8 callgsubr + return + + + 104 61 86 46 104 61 rlinecurve + 32 117 2 9 -3 38 callgsubr + endchar + + + -2 -1 hvcurveto + -64 callgsubr + return + + + -80 callgsubr + -28 -68 -14 -71 -47 callgsubr + 29 15 40 -15 11 -20 rrcurveto + endchar + + + -2 6 vhcurveto + 1 1 rlineto + 7 5 2 3 3 hvcurveto + 15 17 14 17 -100 callgsubr + rrcurveto + 3 7 return + + + 1 3 vhcurveto + 11 24 14 70 callgsubr + 12 -14 -26 9 hvcurveto + 2 -3 return + + + rmoveto + -5 -5 -3 -6 -5 vvcurveto + -4 2 -4 3 -4 vhcurveto + 43 -50 rlineto + -5 4 5 -1 5 hhcurveto + 3 return + + + 38 -32 17 -32 17 -35 -14 -37 -44 return + + + vhcurveto + 18 24 15 27 31 11 rrcurveto + 14 -6 24 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -26 -12 return + + + 106 62 33 117 rcurveline + 1 6 -7 2 -5 -2 -108 -63 -108 -63 -108 -63 -32 return + + + -3 callsubr + endchar + + + 500 125 rmoveto + 45 65 49 148 -9 79 -7 59 -62 102 -45 -62 -27 -37 return + + + 45 callgsubr + 7 16 6 19 15 45 return + + + rmoveto + 1 callsubr + return + + + 53 callgsubr + -22 -11 -26 -6 -31 -1 return + + + 7 67 rrcurveto + 2 -4 0 -1 -7 vhcurveto + -11 -44 -32 -29 -49 -9 4 16 3 return + + + 15 73 5 25 -13 13 -31 1 -31 1 -21 -102 callgsubr + -17 -18 return + + + 29 46 -67 -24 -76 -26 -64 -26 rlinecurve + -33 -52 61 30 81 28 69 24 rlinecurve + return + + + 35 44 27 49 20 53 26 callsubr + return + + + 4 38 6 61 -14 54 32 callsubr + return + + + 3 -8 -5 rlinecurve + -70 callsubr + -22 -81 rcurveline + endchar + + + -13 hhcurveto + -8 -8 -1 -3 -8 hvcurveto + -48 -16 -50 -53 -29 -38 -25 -34 return + + + -2 5 52 callgsubr + rrcurveto + return + + + rmoveto + -4 -2 -4 -4 -4 vhcurveto + -11 -11 -18 -10 -23 -8 rrcurveto + -11 -31 return + + + 15 callsubr + -24 return + + + 92 callgsubr + 11 18 18 18 61 58 75 return + + + 18 51 18 51 -7 32 -33 14 -32 13 -39 4 -45 -7 -45 -7 return + + + 33 -17 38 18 19 16 5 6 8 -9 8 -24 rrcurveto + 12 -36 0 return + + + 58 34 58 34 48 46 39 59 23 return + + + rmoveto + 13 -5 10 -14 9 -24 9 -24 return + + + -4 -4 -6 -5 -8 -6 -31 -22 -38 -22 -31 -21 rrcurveto + -5 -3 return + + + rmoveto + 13 -5 11 -14 -90 callsubr + -25 -12 return + + + -99 callgsubr + -8 -8 -4 -57 -27 -66 -15 -71 -13 36 36 return + + + -49 callgsubr + 34 17 28 18 32 6 44 8 41 return + + + 73 569 68 callgsubr + return + + + -20 14 -20 14 -17 -5 -17 -22 -27 -37 -19 -45 -22 -41 return + + + -8 -16 -256 -466 372 return + + + rrcurveto + 13 -6 25 -31 -29 vvcurveto + -11 -6 -8 -10 -5 vhcurveto + return + + + -106 callsubr + -15 -18 -4 -16 9 -13 9 -13 10 2 return + + + -2 -63 callsubr + -17 -18 -27 -33 rrcurveto + -25 -30 return + + + vvcurveto + 29 14 40 26 52 -95 callgsubr + return + + + -43 rrcurveto + -1 -1 -1 0 vhcurveto + -3 2 -1 6 vhcurveto + 1 return + + + rrcurveto + 5 20 3 18 15 vvcurveto + 39 -20 31 -39 vhcurveto + return + + + -5 31 -7 45 -14 29 -18 12 rrcurveto + 8 -12 -12 return + + + 2 4 0 2 -3 1 -3 1 -2 -2 -2 -2 return + + + -23 -8 rrcurveto + -11 -31 -55 -16 -37 hhcurveto + -4 hlineto + 29 return + + + 40 47 25 29 16 40 -15 11 -21 rrcurveto + endchar + + + -33 rrcurveto + -25 -30 -13 -20 -11 return + + + -9 56 -7 45 -14 29 -18 12 -18 12 -21 return + + + 5 hhcurveto + 29 57 31 17 13 hvcurveto + 33 42 12 return + + + 356 181 rmoveto + -13 -6 -22 -8 -32 -10 return + + + 15 20 18 24 16 27 31 11 rrcurveto + 218 return + + + -107 -63 49 callsubr + return + + + 36 43 56 19 76 8 29 5 40 -2 39 return + + + -10 -28 -10 -21 -17 -14 -23 -9 -16 -8 return + + + -37 hhcurveto + -13 -11 -4 -8 -12 hvcurveto + -61 -42 return + + + 92 -100 43 -47 76 -30 109 -14 rrcurveto + return + + + -22 -20 -16 -15 -12 -19 -7 -23 -7 -23 return + + + -16 -16 -23 rrcurveto + -15 -21 -7 -13 -3 vvcurveto + return + + + 5 4 2 5 3 hvcurveto + return + + + 6 -17 13 11 19 40 return + + + -13 24 -16 20 -20 14 rrcurveto + 6 -8 return + + + -2 -2 vhcurveto + -9 -21 -14 -17 -20 -11 return + + + 4 29 rlineto + 1 vlineto + -51 -65 -6 -39 return + + + 6 rrcurveto + -1 hlineto + -18 -38 -20 -34 -16 return + + + -108 -63 -33 -116 rcurveline + -60 -96 return + + + -50 -40 -74 -40 -74 -41 -78 -41 -82 return + + + + + + 136 50 -200 rmoveto + 400 1000 -400 -1000 hlineto + 50 50 rmoveto + 900 300 -900 -300 vlineto + endchar + + + -117 -79 callsubr + + + 319 206 262 rmoveto + -117 -92 -114 -220 30 -142 55 -261 425 67 163 198 4 4 -12 -3 -5 -1 -175 -46 -260 -38 -136 153 -78 88 247 210 55 48 40 35 65 42 14 36 45 116 rcurveline + -60 -58 -97 -59 -47 46 -32 27 -16 25 -8 49 40 -4 34 -7 60 callgsubr + -99 2 -58 -206 91 -113 9 -12 10 -11 11 -10 rrcurveto + endchar + + + -23 389 548 rmoveto + -10 hlineto + -24 -18 23 callsubr + -13 -20 -11 -1 1 -1 -1 vvcurveto + 14 -90 -116 -114 -49 -53 -36 -66 -24 -78 rlinecurve + -16 -51 -8 -49 -44 vvcurveto + -102 38 -67 68 -34 vhcurveto + -22 45 51 -11 55 hhcurveto + 85 67 19 35 76 hvcurveto + 67 31 53 40 41 49 rrcurveto + 2 vlineto + 1 0 0 -1 -2 -5 -1 -2 -6 vhcurveto + -19 -77 -100 -21 -96 hhcurveto + -132 -99 35 74 -66 hvcurveto + -12 14 -6 16 19 vvcurveto + 11 2 11 5 13 vhcurveto + 11 34 18 34 24 35 37 52 64 69 41 37 19 16 22 17 27 19 27 19 18 17 10 17 5 6 5 8 7 10 51 79 rcurveline + 8 12 6 15 -40 callgsubr + 6 6 vvcurveto + 35 -31 11 -41 1 vhcurveto + endchar + + + 156 274 317 rmoveto + 36 -3 35 -8 34 -10 42 130 rcurveline + -32 8 -27 8 -37 1 rrcurveto + -1 hlineto + -21 -20 -10 -21 -17 hvcurveto + -33 -40 -26 -67 -52 callgsubr + -62 -17 -60 -6 -80 -11 -23 -130 rcurveline + 70 15 73 16 78 18 78 18 74 28 71 38 1 2 3 7 7 14 2 callgsubr + -28 -89 callsubr + + + 352 461 323 rmoveto + 35 -3 35 -7 35 -11 42 130 rcurveline + -32 8 -28 40 callgsubr + -47 -14 -90 -18 -63 -6 -70 -7 -89 0 -14 51 -101 callgsubr + rrcurveto + 38 -4 46 2 54 8 54 8 54 11 55 14 92 24 111 38 70 37 1 2 3 8 7 13 12 24 16 33 44 callgsubr + rrcurveto + -22 -11 -26 -6 -31 -1 -32 26 -28 36 -7 50 rrcurveto + endchar + + + 188 475 121 rmoveto + 3 8 62 119 -19 -7 -48 -18 -39 -29 -62 -2 -32 27 -26 36 -8 49 40 -4 34 -6 31 -10 42 130 rcurveline + -33 8 -29 8 -35 1 -86 2 -64 -204 50 -78 -38 -11 -93 -16 -40 10 -25 6 -14 32 4 30 rrcurveto + 3 -3 1 -3 -4 vhcurveto + -41 -57 -31 -106 66 -32 77 -38 309 125 51 27 rrcurveto + endchar + + + 392 499 330 rmoveto + 37 -4 35 -7 33 -10 42 129 rcurveline + -32 8 -28 9 -37 1 -52 1 -34 -67 -15 -44 -18 -52 -8 -74 28 -43 -59 -17 -103 -21 -74 -6 -69 -6 -93 -1 -13 49 -87 callsubr + -29 27 -14 28 -3 rrcurveto + 37 -4 48 2 57 8 57 8 58 12 59 15 99 25 123 38 74 40 1 2 3 8 7 13 12 23 16 35 21 callgsubr + -7 -31 -1 -31 27 -27 36 -8 50 rrcurveto + endchar + + + 122 242 421 rmoveto + 36 -3 35 -8 34 27 callgsubr + -17 -52 -9 -75 28 -43 -40 -11 -31 -14 -21 -15 -21 -15 -22 -31 -20 -47 -20 -47 -8 -32 -10 -51 -105 callsubr + 55 88 55 44 106 31 66 19 60 22 58 31 1 2 3 7 7 14 12 24 14 34 9 -2 callsubr + rrcurveto + -32 27 -27 -89 callsubr + + + 279 392 405 rmoveto + 37 -4 34 -7 33 -10 43 130 rcurveline + -32 8 -29 40 callgsubr + -41 -11 -34 -21 -30 -29 -56 -55 -44 -74 -33 -75 -16 -37 -12 -31 -14 -24 -8 -16 rcurveline + 4 30 rlineto + -89 callgsubr + 33 39 30 28 26 17 52 33 50 13 65 18 31 8 37 17 44 23 1 2 3 8 7 13 rrcurveto + 11 23 16 34 8 -2 callsubr + -32 27 -26 -89 callsubr + + + 151 270 406 rmoveto + 35 -3 35 -7 35 65 callgsubr + -52 1 -34 -66 -15 -44 -18 -52 -9 -75 28 -43 -78 -22 -45 -40 -40 -68 -22 -38 -16 -41 -19 -42 21 -2 rcurveline + 14 33 18 26 24 18 60 45 76 19 84 30 32 11 31 11 28 10 28 10 17 7 6 3 -66 callsubr + 24 15 33 8 25 4 12 0 5 -5 -2 rrcurveto + -75 callgsubr + -22 -11 -26 -7 -31 -1 -31 27 -27 36 -8 50 rrcurveto + endchar + + + 314 280 387 rmoveto + 37 -4 35 -7 33 27 callgsubr + -18 -52 -9 -75 28 -43 -15 -4 -18 -7 -21 -11 -30 -15 -26 -15 -23 -15 -46 -31 -34 -47 -17 -60 40 -30 rcurveline + 22 25 23 20 28 18 42 26 59 27 52 15 66 19 59 24 58 31 -66 callsubr + 23 16 34 21 callgsubr + -48 callgsubr + + + 172 290 358 30 callgsubr + rrcurveto + -1 hlineto + -21 -20 -11 -21 -17 hvcurveto + -33 -40 -26 -66 -52 callgsubr + -15 -5 -21 -4 -26 -4 -1 -1 rcurveline + -3 -1 hlineto + -42 -10 -38 -15 -25 -26 -21 -22 -20 -30 -14 -32 -88 callgsubr + 34 34 36 9 48 14 114 26 97 27 96 51 1 2 3 8 7 13 2 callgsubr + -27 -89 callsubr + + + 417 523 330 rmoveto + 36 -3 35 -7 34 -10 42 129 rcurveline + -32 8 -28 9 -37 1 rrcurveto + -1 hlineto + -21 -19 -11 -21 -17 hvcurveto + -33 -40 -26 -67 -52 callgsubr + -50 -14 -54 -12 -56 -11 rrcurveto + -7 -38 -37 -4 -36 hhcurveto + -62 -45 7 42 -20 hvcurveto + -4 7 -2 10 10 24 callsubr + 2 -1 1 -1 vhcurveto + -2 hlineto + -2 -2 0 -2 -1 hvcurveto + -10 -14 -15 -24 16 callgsubr + -43 10 50 -14 62 hhcurveto + 26 29 2 5 34 hvcurveto + 56 7 58 12 60 15 101 25 124 39 77 41 1 2 3 8 7 14 12 24 16 33 8 25 rrcurveto + 2 5 1 5 2 vvcurveto + 3 -1 1 -2 vhcurveto + 0 0 -1 -1 vhcurveto + -75 callgsubr + -22 -11 -27 -48 callgsubr + + + 123 243 362 30 callgsubr + -52 1 -34 -67 -15 -44 -18 -52 -9 -74 28 -43 -55 -15 -40 -25 -27 -34 -27 -35 -22 -38 -22 -44 19 -18 rcurveline + 14 19 17 15 19 12 40 25 12 5 56 19 55 19 73 24 55 20 29 10 17 7 6 3 -66 callsubr + 23 15 35 8 25 4 12 1 5 -5 -2 rrcurveto + -24 -9 -24 -11 -22 -11 -22 -11 -26 -48 callgsubr + + + -78 372 351 rmoveto + -10 hlineto + -23 -19 -3 -63 callsubr + -16 -17 -28 31 callsubr + -1 1 -1 -1 vvcurveto + 19 -66 -72 -12 -71 -12 -72 -12 rlinecurve + -1 -1 -21 -122 69 11 120 27 53 21 rlinecurve + 15 5 20 10 26 17 26 17 21 23 19 29 51 79 rcurveline + 8 12 6 16 32 callgsubr + + + 42 361 59 rmoveto + 15 4 21 10 25 17 25 17 22 24 19 29 52 79 callgsubr + -38 19 -47 1 -28 1 -22 -2 -17 -5 -6 -5 -16 -18 -28 -33 -28 -33 -12 -21 3 -9 20 -67 rcurveline + -58 -16 -91 -17 -73 4 -44 2 -42 10 -10 34 -13 -34 -13 -42 -13 -51 -79 callgsubr + 91 -9 151 41 63 26 rrcurveto + endchar + + + -78 38 7 rmoveto + 73 -36 208 98 50 79 51 79 rcurveline + 15 24 22 46 -27 26 -21 20 -71 -1 -33 -10 -11 -9 -83 -91 6 -19 20 -66 rcurveline + -38 -6 -75 -18 -40 10 -26 7 -14 35 6 31 rrcurveto + 2 -1 0 -2 -2 vhcurveto + -42 -56 -35 -110 68 -33 rrcurveto + endchar + + + 103 422 64 rmoveto + 15 4 20 11 26 17 26 17 22 23 19 29 51 79 rcurveline + 8 12 7 16 6 19 6 19 -3 17 -14 13 -20 19 -75 -1 -31 -9 -6 -4 -16 -18 -28 -33 -28 -33 -12 -21 3 -10 20 -66 rcurveline + -46 -15 -95 -16 -64 -4 -68 -5 -92 2 -14 49 -87 callsubr + -30 27 -14 28 -3 49 -5 63 5 76 15 76 15 60 16 42 17 rrcurveto + endchar + + + -30 291 174 rmoveto + 15 4 19 45 callgsubr + 8 16 6 19 6 19 -4 17 -13 13 rrcurveto + 10 -11 -19 6 -28 hhcurveto + -28 -22 -2 -5 -17 hvcurveto + -6 -4 -17 -18 -28 -33 -28 -33 -12 -21 3 -10 20 -66 rcurveline + -61 -12 -42 -11 -26 -10 -26 -10 -31 -33 -37 -57 -35 -53 -21 -46 -7 -37 -105 callsubr + 31 49 43 40 55 28 63 32 22 -3 65 26 rrcurveto + endchar + + + 145 465 168 rmoveto + 15 4 20 -4 callsubr + -37 18 -47 1 -28 1 -22 -2 -17 -5 -6 -5 -16 -18 -28 -33 -28 -33 -12 -20 3 -10 19 -66 rcurveline + -71 -12 -52 -16 -34 -18 -34 -18 -35 -33 -38 -49 -70 -90 -16 -39 -47 -96 -9 -18 rcurveline + 4 30 rlineto + -89 callgsubr + 56 67 37 28 93 19 23 5 29 9 34 14 rrcurveto + endchar + + + 10 330 167 rmoveto + 15 4 19 11 26 17 26 17 22 24 19 29 51 79 callgsubr + -37 19 -47 1 -28 1 -22 -2 -17 -5 -6 -4 -16 -19 -28 -33 -28 -33 -12 -21 3 -10 19 -66 rcurveline + -27 -5 -55 -13 -31 -9 -49 -13 -23 -5 -33 -31 -52 -47 -24 -73 -31 -69 21 -2 rcurveline + 16 36 27 29 37 22 65 38 91 12 73 30 rrcurveto + endchar + + + -70 252 118 rmoveto + 15 4 20 11 25 17 25 17 22 23 19 29 51 79 rcurveline + 7 12 7 16 6 19 6 19 -3 17 -13 13 -20 19 -73 -1 -32 -9 -6 -4 -16 -18 -27 -33 -27 -33 -12 -21 3 -10 19 -66 rcurveline + -32 -6 -30 -7 -26 -8 -86 -25 -45 -53 -29 -88 -106 callsubr + 40 -30 21 25 26 22 26 16 rlinecurve + 60 36 14 -8 65 27 rrcurveto + endchar + + + -77 373 378 rmoveto + -10 hlineto + -24 -19 23 callsubr + -12 -20 -11 vvcurveto + -3 vlineto + 20 -65 -31 -6 1 1 -33 -6 -31 -5 -27 -3 rlinecurve + -27 -3 -27 -25 -30 -49 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 11 11 23 10 33 9 51 14 43 10 47 19 15 5 20 11 26 17 26 17 22 23 19 29 50 79 rcurveline + 8 12 7 15 -40 callgsubr + 6 6 vvcurveto + 35 -31 11 -41 1 vhcurveto + endchar + + + 160 617 361 rmoveto + -10 hlineto + -24 -19 -3 -63 callsubr + -16 -17 -27 31 callsubr + vvcurveto + -3 vlineto + 20 -66 -46 -8 -55 -9 -63 -11 rlinecurve + -8 -45 -41 -4 -37 hhcurveto + -59 -41 9 40 -19 hvcurveto + -4 7 -2 10 10 vvcurveto + 29 14 40 26 52 vhcurveto + -2 callgsubr + -42 9 49 -15 61 hhcurveto + 58 51 8 10 55 hvcurveto + 66 12 81 18 51 21 15 4 21 11 26 17 26 17 21 23 19 29 51 80 rcurveline + 8 12 6 15 32 callgsubr + + + 2 321 155 rmoveto + 15 4 21 -4 callsubr + -38 19 -47 1 rrcurveto + -28 -22 -2 -5 -17 hvcurveto + -6 -5 -16 -17 -28 -33 -28 -33 -12 -21 3 -10 20 -67 rcurveline + -49 -8 -77 -19 -44 -16 -43 -15 -38 -47 -20 -41 -13 -27 -15 -34 -18 -39 19 -8 rcurveline + 30 54 44 35 60 14 60 14 56 17 52 21 rrcurveto + endchar + + + 319 340 830 -107 callgsubr + -134 -568 -20 callgsubr + + + -116 18 callsubr + endchar + + + -252 73 570 rmoveto + 39 -570 62 118 -38 569 rlineto + endchar + + + 30 354 564 rmoveto + -65 -120 34 -299 67 112 -8 108 -16 95 -12 104 rlinecurve + endchar + + + -116 131 744 -106 callgsubr + -58 -175 -76 callsubr + + + -116 18 callsubr + -9 -756 -106 callgsubr + endchar + + + -116 293 845 -6 callgsubr + -176 -219 -76 callsubr + + + 251 -40 callsubr + + + 50 136 487 rmoveto + -41 callgsubr + -17 -23 -20 -34 -24 -42 -24 -42 -19 -44 -13 -46 rrcurveto + -9 -32 -5 -29 -30 vvcurveto + -70 21 -40 56 -30 vhcurveto + -16 29 33 -7 35 hhcurveto + 12 12 0 2 13 hvcurveto + 50 7 50 16 49 24 86 42 97 73 47 73 rrcurveto + 16 24 8 21 18 vvcurveto + 31 -23 23 -29 4 vhcurveto + -67 9 -63 27 -19 58 -15 -26 -12 -26 -10 -27 rrcurveto + -7 -18 -3 -16 -13 vvcurveto + -7 1 -5 2 -6 vhcurveto + 8 -27 17 -19 28 -12 28 -12 31 -8 34 -3 -64 -41 -71 -28 -78 -14 rrcurveto + -5 -25 -26 -2 -27 hhcurveto + -95 -74 33 88 21 3 23 7 22 hvcurveto + 16 52 37 60 21 44 rrcurveto + -88 callsubr + 0 -2 vhcurveto + endchar + + + 432 287 8 rmoveto + 135 -17 138 11 114 34 133 40 114 72 69 107 38 59 -10 54 -56 8 -70 10 -51 27 -33 48 -14 -25 -11 -24 -9 -25 -21 -61 24 -39 45 -19 28 -12 30 -7 34 -3 rrcurveto + -67 -44 -72 -29 -78 -14 -78 -14 -79 -10 -77 -6 -96 callsubr + 36 3 callgsubr + -10 -64 -17 -143 -37 14 callgsubr + + + 276 193 1 rmoveto + 102 8 93 43 70 48 61 42 24 35 35 57 6 9 9 16 10 20 5 10 4 9 5 10 7 14 3 28 -13 11 -24 18 -36 10 -33 8 -104 25 rcurveline + -1 vlineto + -18 -38 -20 -33 -16 80 callgsubr + -10 51 -19 8 -4 5 -3 1 -6 -69 callsubr + -36 -20 -36 -17 -36 -15 -63 -27 -75 -20 -90 6 rrcurveto + -39 3 -31 10 -22 18 -46 36 -9 52 21 67 16 52 37 61 21 44 4 8 -9 0 -3 -4 -17 -23 -20 -33 -24 -42 -24 -42 -19 -44 -13 -46 -13 -46 -4 -44 6 -42 rrcurveto + 11 -77 79 -50 99 8 rrcurveto + endchar + + + 429 287 7 rmoveto + 43 -6 52 -2 61 2 135 4 124 29 97 49 54 27 42 35 29 45 11 18 16 25 20 33 20 33 10 28 -1 21 -1 7 -3 6 -5 4 -18 14 -32 13 -45 10 rrcurveto + -45 10 -35 8 -23 6 -106 callsubr + -19 -39 -18 -33 -17 80 callgsubr + -9 51 -19 7 -3 5 -4 2 -6 -69 callsubr + -72 -38 -70 -26 -67 -12 -67 -12 -78 -9 -87 -7 rrcurveto + -69 callgsubr + -122 40 callsubr + endchar + + + 719 287 9 rmoveto + 135 -17 138 12 114 34 133 40 114 72 69 107 28 44 3 34 -23 25 -18 19 -33 0 -28 8 -40 11 -25 12 -9 13 -9 13 0 13 7 11 11 17 41 21 30 -9 rrcurveto + 20 32 11 40 17 35 rrcurveto + 9 4 -12 1 -6 hhcurveto + -35 -2 -29 -28 -19 -17 -21 -21 -24 -36 -30 -53 -30 -53 -11 -40 8 -28 8 -27 18 -19 28 -12 28 -12 30 -8 34 -3 -67 -44 -72 -28 -78 -14 -78 -14 -79 -10 -77 -6 rrcurveto + -96 callsubr + 35 3 callgsubr + -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 -122 92 -100 43 -47 76 -31 109 -14 rrcurveto + endchar + + + -116 29 757 rmoveto + 75 74 -46 -89 101 42 28 11 26 15 16 22 12 16 16 21 -15 18 -12 14 -27 -8 -11 -10 -23 -21 -22 -22 -20 -24 rrcurveto + -1 -3 -2 0 -2 hhcurveto + -35 42 -55 -64 -10 -40 -1 -4 8 6 2 2 rrcurveto + 182 90 rmoveto + 2 -3 1 -4 -4 -2 -20 -10 -24 -5 -25 -5 13 13 12 14 17 9 10 5 14 -4 4 -8 rrcurveto + -138 -278 -76 callsubr + + + -36 callsubr + + + -243 -16 callgsubr + + + -16 callgsubr + + + -36 callsubr + + + 437 -81 callsubr + -309 -579 -107 callsubr + endchar + + + 437 -81 callsubr + endchar + + + 126 489 43 rmoveto + -1 -5 -1 -4 -3 vvcurveto + -4 1 -1 2 vhcurveto + 1 hlineto + 25 26 20 31 15 35 15 35 13 31 6 22 rrcurveto + 1 2 27 -6 -14 vhcurveto + -9 -20 -16 -20 -19 -10 rrcurveto + -36 -69 -144 -7 -36 hhcurveto + -174 -46 45 71 3 hvcurveto + 2 41 13 38 24 45 9 22 -18 7 -11 -17 -24 -39 -24 -44 -23 -51 rrcurveto + -13 -30 -6 -29 -27 vvcurveto + -161 204 2 41 84 103 20 23 57 vhcurveto + endchar + + + 485 287 7 rmoveto + 96 -12 95 3 95 19 95 19 91 27 89 36 -5 -12 1 -6 6 1 25 27 19 30 -73 callsubr + 1 3 6 vvcurveto + 6 -2 1 -4 -5 vhcurveto + -9 -22 -13 -15 -20 -11 -56 -31 -71 -23 -84 -15 -84 -15 -75 -10 -63 -5 -158 -2 -120 62 callgsubr + 19 18 17 61 58 75 42 90 28 rrcurveto + 22 callgsubr + -38 14 callgsubr + + + -70 252 393 rmoveto + -77 -113 rlineto + 17 -58 9 -36 -14 vvcurveto + -19 -13 -21 -9 -24 -6 -24 -6 -38 -7 -52 -6 rrcurveto + -1 hlineto + -22 -125 40 4 35 6 28 8 rlinecurve + 66 19 41 46 34 57 42 69 -4 101 -30 83 rrcurveto + endchar + + + 128 369 266 rmoveto + 14 -40 7 -31 -1 -21 -47 -20 -85 -20 -66 -5 -64 -5 -75 5 -13 47 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 39 -4 45 2 51 6 51 6 44 14 37 20 rrcurveto + 78 40 54 86 12 100 2 16 -3 22 -7 30 -7 30 -3 13 -3 -4 rrcurveto + endchar + + + -51 301 245 rmoveto + -3 2 -17 -46 -26 -29 -34 -12 rlinecurve + -34 -12 -67 -9 -102 -5 -18 -134 rcurveline + 94 6 67 14 40 23 32 18 24 32 17 43 rrcurveto + 17 43 10 36 30 vvcurveto + endchar + + + 9 355 253 rmoveto + 3 -2 1 -1 -2 vhcurveto + -31 -85 -144 -53 -93 24 -27 7 -12 36 6 31 rrcurveto + 1 -1 2 -2 -3 vhcurveto + -43 -56 -35 -111 68 -33 126 -61 188 136 3 163 rrcurveto + endchar + + + 195 433 279 rmoveto + 14 -39 6 -31 -1 -22 -52 -23 -104 -24 -73 -8 -74 -8 -95 -1 -15 52 -13 -35 -13 -42 -13 -50 1 -29 27 -14 28 -3 39 -4 55 2 69 10 114 16 71 27 57 66 rrcurveto + 39 46 23 56 7 64 2 16 -2 22 -7 30 -7 30 -4 13 -3 -4 rrcurveto + endchar + + + 59 1 hmoveto + 73 hlineto + 14 15 15 15 16 14 32 28 38 22 45 15 19 5 20 1 23 -2 11 -2 12 -1 5 9 18 34 14 39 15 37 -5 6 rcurveline + -30 12 -34 -3 -39 -18 rrcurveto + -1 hlineto + -1 -3 -2 -1 -2 hhcurveto + -54 -22 -46 -30 -39 -37 -39 -37 -28 -30 -18 -24 -18 -24 -10 -15 -2 -5 rrcurveto + endchar + + + 195 377 176 rmoveto + 24 10 28 3 29 -3 11 -2 12 -1 5 9 19 34 13 39 15 37 -5 6 rcurveline + -24 10 -29 0 -32 -11 -32 -11 -31 -15 -32 -21 -53 -35 -63 -57 -36 -46 -105 callgsubr + 50 59 57 61 77 30 rrcurveto + endchar + + + 3 288 149 rmoveto + 8 21 12 30 17 38 17 38 -1 25 -21 12 -33 19 -33 1 -31 -17 -66 -36 -54 -73 -37 -69 -20 -37 -15 -30 -10 -21 -8 -18 -6 -12 -2 -7 -2 -7 -2 -5 -1 -1 rrcurveto + 18 hlineto + 14 22 18 28 23 33 23 33 25 27 26 23 26 23 26 12 25 2 25 2 21 -18 18 -38 rrcurveto + endchar + + + 314 235 214 rmoveto + -5 vlineto + -25 -20 -28 -14 -31 -10 -60 -19 -69 -59 -22 -56 46 -32 rcurveline + 1 2 2 1 2 1 40 29 43 26 45 25 25 14 20 19 17 25 19 29 13 27 8 24 rrcurveto + 12 30 5 31 34 vvcurveto + 1 61 -19 49 -38 37 -63 -111 rcurveline + 19 -29 14 -26 8 -23 rrcurveto + -1 vlineto + 5 -15 8 -30 2 -14 rrcurveto + endchar + + + -41 308 229 rmoveto + -17 -16 -29 -9 -27 -4 -28 -6 -28 -4 -25 -4 -61 -9 -39 41 callgsubr + -16 9 -13 9 -13 10 2 11 17 20 20 25 12 23 4 24 4 30 7 35 9 76 19 34 54 7 87 rrcurveto + endchar + + + 279 520 234 rmoveto + -2 vlineto + -63 -30 -74 -36 -83 -19 -91 -17 rlinecurve + -4 -19 -17 -2 -16 hhcurveto + -53 -37 20 53 30 14 42 29 57 hvcurveto + 1 2 0 1 0 callgsubr + -43 9 51 -14 61 hhcurveto + 27 30 3 6 31 hvcurveto + 50 9 48 16 47 21 82 37 91 59 36 75 rrcurveto + 20 41 10 37 35 vvcurveto + 19 -3 18 -6 17 vhcurveto + -24 74 -76 -113 rlineto + 10 -29 21 -57 -34 vvcurveto + endchar + + + -187 105 87 rmoveto + -22 -18 -47 -17 -29 -10 -7 -17 rcurveline + 98 -25 19 25 24 41 10 33 rlinecurve + 12 30 6 31 34 vvcurveto + 60 -19 50 -37 37 vhcurveto + -64 -112 20 -30 15 -26 7 -22 rlinecurve + 5 -14 8 -31 2 -14 rrcurveto + -1 -2 0 -1 -2 vvcurveto + endchar + + + 674 287 11 callgsubr + 30 62 7 56 -16 49 rrcurveto + -24 74 0 0 0 vvcurveto + -77 -114 -102 callsubr + rlinecurve + 0 -1 -100 callsubr + -26 -99 callsubr + rrcurveto + endchar + + + -158 205 24 rmoveto + 1 hlineto + 50 53 28 81 15 47 2 3 -1 21 -5 -11 -7 -17 -17 -24 -25 -11 -53 -23 -147 -14 -25 -2 -21 -127 rcurveline + 58 6 99 16 46 19 -2 -7 -1 -11 5 1 rrcurveto + endchar + + + -17 348 25 rmoveto + 25 26 19 31 -73 callsubr + 0 4 6 vvcurveto + 6 -1 1 -3 -5 vhcurveto + -10 -22 -14 -17 -19 -10 -24 -13 -41 -11 -58 -7 -58 -7 -42 -5 -25 1 -48 1 -48 10 -11 36 -78 callsubr + 36 -3 48 3 62 8 rrcurveto + 62 8 48 11 34 14 -5 -12 1 -6 6 1 rrcurveto + endchar + + + -136 226 35 rmoveto + -7 -23 16 2 7 12 32 60 34 68 13 43 2 3 1 21 -7 -10 -8 -21 -15 -17 -19 -11 -29 -16 -111 -26 -49 12 rrcurveto + -26 7 -8 33 30 vvcurveto + 7 1 1 -6 -7 vhcurveto + -46 -53 -28 -111 67 -33 42 -20 114 37 30 12 rrcurveto + endchar + + + 31 56 1 rmoveto + 40 -4 58 3 76 11 76 11 54 12 34 14 -4 -12 1 -6 5 1 25 26 20 31 15 35 15 35 11 29 7 23 rrcurveto + 1 2 0 4 6 vvcurveto + 6 -1 1 -4 -5 vhcurveto + -9 -22 -14 -16 -20 -11 -21 -12 -41 -10 -64 -9 -64 -9 -45 -5 -28 -1 -60 -3 -67 6 -13 43 -78 callsubr + rrcurveto + endchar + + + 88 12 2 rmoveto + 23 36 18 30 14 21 14 21 25 27 37 30 35 29 38 22 41 15 30 12 21 -21 9 -18 5 -16 11 -8 17 1 rrcurveto + 4 7 3 2 8 hvcurveto + 62 134 -33 -5 rlineto + -2 -1 0 1 -2 hvcurveto + 15 -12 -9 28 -27 hhcurveto + -26 -28 -7 -14 -31 hvcurveto + -59 -28 -58 -49 -43 -45 -26 -26 -23 -28 -21 -26 -13 -32 -14 -63 -3 -38 -105 callsubr + endchar + + + 208 237 76 rmoveto + 36 39 52 50 54 15 23 6 18 -9 12 -24 4 -16 10 -8 18 1 6 1 7 2 6 2 62 134 rcurveline + -33 -5 -5 2 -25 31 -27 14 -30 -4 rlinecurve + -30 -4 -30 -12 -29 -21 -29 -21 -26 -26 -25 -29 -25 -29 -20 -24 -15 -19 -1 callgsubr + 23 54 52 64 51 56 rrcurveto + endchar + + + -38 223 179 rmoveto + -50 -21 -55 -14 -60 -11 -58 -133 rcurveline + 28 7 27 7 27 7 106 28 73 67 25 102 17 62 2 57 -11 53 -11 53 -7 25 -2 -3 -76 -113 rcurveline + 18 -69 7 -29 -75 vvcurveto + endchar + + + -128 215 293 rmoveto + 9 -114 -47 -20 -56 -12 -56 -10 rlinecurve + -65 -137 156 50 29 16 24 19 20 22 rlinecurve + 8 -107 74 117 -22 294 rlineto + endchar + + + -77 185 141 rmoveto + 27 10 21 -10 14 -29 4 -16 10 -7 18 1 6 1 7 1 6 2 63 135 rcurveline + -33 -5 -6 1 -18 23 -21 15 -21 5 rlinecurve + -20 4 -19 -3 -20 -9 -20 -9 -19 -13 -19 -18 -55 -53 -56 -87 -34 -72 30 -8 rcurveline + 39 55 49 60 67 26 rrcurveto + endchar + + + -123 304 354 rmoveto + 3 -2 1 -3 -1 vhcurveto + -4 -2 -3 -3 -3 -7 -14 -34 -39 -32 -64 -28 -62 -27 -51 -10 -41 6 -18 -133 rcurveline + 28 7 27 7 27 7 62 16 48 28 37 43 13 -195 rcurveline + 73 128 -6 74 -7 74 2 78 rlinecurve + endchar + + + -105 240 114 rmoveto + 4 -16 10 -8 18 1 2 1 8 1 10 3 62 134 rcurveline + -33 -5 rlineto + 1 -3 -2 1 -1 hhcurveto + 15 -12 -9 27 -27 hhcurveto + -37 -33 -10 -18 -28 hvcurveto + -28 -18 -25 -22 -22 -25 -11 -13 -18 -24 -23 -34 -23 -34 -14 -25 -5 -14 47 -32 rcurveline + 1 vlineto + 17 24 20 27 23 30 23 30 23 19 26 10 30 12 22 -21 9 -18 rrcurveto + endchar + + + -40 307 31 rmoveto + 2 123 -30 -4 -24 9 4 31 rlinecurve + 1 28 -83 -24 -43 -13 -52 -16 -31 -18 -11 -21 -12 -23 -7 -27 -10 -24 -1 -1 -10 -17 1 -2 -7 -28 22 -17 18 26 11 11 13 10 12 7 21 8 27 7 30 7 rrcurveto + 30 7 14 -1 -1 -11 -5 -31 12 -13 27 4 27 4 28 4 27 5 rrcurveto + endchar + + + 124 106 333 rmoveto + -2 -1 -1 -14 callsubr + -41 9 44 -15 60 hhcurveto + 60 52 8 9 57 hvcurveto + 66 11 85 16 49 21 rrcurveto + -1 -5 -1 -3 -3 vvcurveto + -4 1 -2 3 vhcurveto + 25 27 20 30 -73 callsubr + 0 3 6 vvcurveto + 4 0 2 -1 -1 -1 -2 46 callsubr + rrcurveto + -32 -92 -129 -31 -120 hhcurveto + -57 -38 8 35 -21 hvcurveto + -5 8 -3 11 12 vvcurveto + 29 13 41 27 52 vhcurveto + -88 callsubr + 1 -2 vhcurveto + endchar + + + -106 281 264 rmoveto + 1 1 -8 4 -11 1 -14 -2 rlinecurve + -45 -5 -40 -18 -33 -32 -58 -55 -45 -67 -28 -84 21 -7 rcurveline + 39 55 50 60 67 26 11 4 10 1 10 -4 -106 callsubr + 13 -4 11 -10 7 -15 4 -16 11 -7 17 1 5 1 7 1 8 2 62 135 rcurveline + -34 -5 rlineto + 0 -1 0 -4 1 vhcurveto + -10 12 -7 19 -15 8 rrcurveto + endchar + + + -86 127 hmoveto + -22 callsubr + endchar + + + -86 127 219 -5 callgsubr + + + 517 689 794 -107 callsubr + -340 -668 -25 callgsubr + + + 3 242 311 -95 callsubr + + + 26 374 164 rmoveto + -5 -5 -2 -4 -4 hvcurveto + -14 -13 -17 -8 -18 -3 -99 -16 -109 -1 -93 -23 rrcurveto + -7 -2 -3 -3 -3 vvcurveto + -2 1 -1 2 -2 vhcurveto + 8 -7 25 -13 42 -18 42 -18 26 -10 11 -3 rrcurveto + -8 25 24 -4 21 hhcurveto + 45 24 18 38 25 hvcurveto + 15 24 18 26 22 16 rrcurveto + 8 3 6 10 12 vvcurveto + 9 -5 8 -11 vhcurveto + endchar + + + 79 80 -22 callgsubr + + + -36 26 rmoveto + -7 -22 -4 -18 -14 vvcurveto + -23 8 -18 20 5 5 2 2 5 vhcurveto + 22 9 32 33 29 vvcurveto + 28 -28 15 -19 11 vhcurveto + 6 6 8 7 10 7 41 29 51 32 42 27 rrcurveto + 7 4 2 2 1 vvcurveto + -6 -1 -81 -20 -55 -27 -43 -58 rlinecurve + -7 5 -6 1 -5 7 rrcurveto + -8 -12 -7 -11 -14 vvcurveto + -1 vlineto + 1 -9 5 -5 6 -4 rrcurveto + 37 -54 rmoveto + -3 hlineto + -12 -5 11 14 6 0 6 2 8 hvcurveto + 10 -5 27 -10 -14 vvcurveto + -9 -11 -6 -8 -1 vhcurveto + endchar + + + 53 -9 rmoveto + 7 22 2 16 -1 9 -2 12 -6 1 -7 -8 -3 -2 -2 -3 -3 -4 rrcurveto + -18 -12 -12 -8 -11 hhcurveto + -9 3 -7 5 -4 7 rrcurveto + 1 hlineto + -4 11 -1 19 2 15 8 42 18 58 18 33 3 7 3 5 1 2 1 4 0 2 -2 -2 -3 -1 -2 -2 -2 -2 -22 -25 -15 -25 -15 -39 -21 -54 -9 -32 8 -69 rrcurveto + -27 3 15 -13 28 hhcurveto + 24 20 20 41 13 hvcurveto + endchar + + + 47 280 rmoveto + -79 -25 -65 -52 -33 -72 -19 -32 -5 -53 29 -24 24 -20 32 9 22 15 23 49 rcurveline + -22 -12 -60 -24 -7 42 -2 8 1 9 4 10 11 24 19 22 20 18 29 26 39 30 44 9 52 11 23 -15 -12 -52 rrcurveto + -2 -6 0 -4 -2 vvcurveto + 1 -5 6 5 2 3 11 12 9 16 3 20 10 63 -57 12 -51 -15 rrcurveto + 32 -200 -22 callgsubr + + + 3 207 705 -98 callgsubr + -57 -290 -95 callsubr + + + 79 13 -107 callsubr + endchar + + + 79 13 -107 callsubr + endchar + + + 3 380 636 -107 callgsubr + -138 -325 -95 callsubr + + + 12 351 139 rmoveto + -65 138 -63 135 -30 169 -2 8 -11 -9 -3 -5 -15 -27 -2 -38 -8 -32 -32 -123 -34 -117 -50 -103 rrcurveto + -48 -5 -45 -7 -41 vhcurveto + 3 -1 2 0 1 3 50 114 47 120 36 134 36 -117 52 -133 58 -121 15 47 15 48 12 44 rrcurveto + endchar + + + -99 247 97 15 callgsubr + -87 -24 -81 1 callgsubr + + + -99 247 366 15 callgsubr + -86 -24 -82 1 callgsubr + + + 636 71 82 rmoveto + -5 -5 -3 -6 -5 vvcurveto + -4 2 -4 3 -4 vhcurveto + 43 -50 rlineto + -5 4 5 -1 5 hhcurveto + 3 4 -68 callgsubr + -5 -55 callgsubr + 293 -41 -10 callsubr + 5 -68 callgsubr + -6 -55 callgsubr + 294 -41 -10 callsubr + 4 -68 callgsubr + -5 -55 callgsubr + endchar + + + 636 205 vmoveto + 1000 58 -1000 hlineto + endchar + + + 177 27 205 rmoveto + 487 58 -487 hlineto + endchar + + + -111 132 194 rmoveto + 13 10 6 18 8 16 29 58 22 70 -7 98 -11 153 -56 100 -50 107 -20 -48 -22 -45 -18 -47 -3 -7 21 -30 4 -8 56 -108 50 -149 -30 -180 rrcurveto + -2 -1 -13 9 7 vhcurveto + -83 -109 -21 callsubr + + + 79 7 -6 callsubr + + + -24 callsubr + + + 315 562 663 -107 callsubr + -474 -629 -72 callgsubr + + + 315 88 34 -72 callgsubr + + + 203 103 386 rmoveto + -5 -4 -3 -6 -4 hvcurveto + -24 -38 -24 -44 -23 -51 rrcurveto + -13 -30 -7 -29 -27 vvcurveto + -19 3 -18 7 -18 vhcurveto + 11 -33 21 -24 31 -17 rrcurveto + -20 35 41 -9 52 hhcurveto + 114 112 33 38 77 hvcurveto + 16 4 57 16 46 30 35 44 rlinecurve + 35 44 28 49 20 54 rrcurveto + 5 20 3 17 15 vvcurveto + 39 -21 32 -39 -24 -26 -16 -32 -27 vhcurveto + -47 -55 -42 -68 -37 -82 -37 -13 -48 -13 -60 -12 rrcurveto + -8 -38 -36 -5 -34 hhcurveto + -19 -17 1 3 -17 hvcurveto + -49 7 -34 20 -20 34 rrcurveto + -6 11 -3 13 15 vvcurveto + 33 14 44 29 54 vhcurveto + 2 5 1 3 3 vvcurveto + 6 -3 3 -7 vhcurveto + 444 -152 rmoveto + 6 2 5 4 5 -8 callsubr + -24 -7 -21 -1 rrcurveto + -9 4 -13 14 14 vvcurveto + endchar + + + 439 287 3 rmoveto + 87 -11 111 10 86 13 94 14 108 27 62 40 69 45 49 76 30 83 -96 callgsubr + -47 -55 -42 -70 -38 -83 -76 -27 -96 -8 -93 -7 rrcurveto + -96 callsubr + 35 -91 callgsubr + 10 18 18 18 61 58 76 42 90 28 -42 callgsubr + -78 -3 -72 -9 -65 -17 -143 -37 -115 -57 -79 -103 -78 -101 -27 -123 40 callsubr + 574 297 rmoveto + 13 -5 11 -14 -90 callsubr + -26 -12 -24 -7 -21 -1 -53 callgsubr + 14 28 32 10 rrcurveto + endchar + + + 26 208 255 rmoveto + 25 22 13 69 callgsubr + -9 -20 7 hvcurveto + 12 -36 -32 -25 -93 -29 -154 -33 rlinecurve + -22 -129 100 21 65 19 33 17 rlinecurve + 33 17 30 25 27 31 29 33 22 43 13 54 rrcurveto + 5 21 3 20 19 vvcurveto + 62 -31 50 -37 27 vhcurveto + 6 -8 -7 3 -7 hhcurveto + -11 -11 -7 -14 -10 hvcurveto + -27 -36 -19 -46 81 callgsubr + 20 -10 25 vhcurveto + endchar + + + 189 456 215 rmoveto + -12 -11 -27 -14 -42 -16 -70 -27 -102 -28 -92 8 -40 4 -24 16 -8 29 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 65 -7 70 8 74 21 74 21 60 35 44 49 rrcurveto + 47 53 53 125 -47 93 -63 callgsubr + -37 -19 -45 -22 -41 -10 -18 -1 -35 19 -9 11 callsubr + 0 0 vvcurveto + endchar + + + 65 328 118 rmoveto + 58 64 34 124 -41 81 -25 49 -45 41 35 callgsubr + 37 15 21 18 10 12 21 -68 2 -7 -30 -15 -157 -69 -67 17 rrcurveto + -24 6 -13 30 2 29 rrcurveto + 4 -4 2 -4 -6 vhcurveto + -40 -58 -29 -101 65 -32 68 -33 175 91 47 52 rrcurveto + endchar + + + 257 509 141 rmoveto + 29 32 22 43 13 55 21 90 -30 73 -51 37 -20 14 -18 -4 -17 -22 -27 -36 -18 -47 -22 -41 -11 -18 -1 -35 19 -9 33 -16 39 18 19 16 6 6 6 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + -16 -14 -31 -16 -49 -18 -82 -31 -117 -31 -106 8 -46 3 -27 17 -8 30 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 68 -7 80 8 93 23 93 23 70 38 49 54 rrcurveto + endchar + + + -152 -42 callsubr + + + 235 193 26 rmoveto + 52 62 52 41 52 19 52 19 46 29 38 39 52 54 50 117 -47 96 -13 24 -16 21 19 callsubr + -10 -19 -1 -34 19 -9 rrcurveto + 11 callsubr + -1 0 vvcurveto + -5 -4 -20 -10 -36 -14 rrcurveto + -14 -36 -19 -8 -2 hhcurveto + -98 -29 -68 50 callsubr + 4 30 rcurveline + -89 callgsubr + rrcurveto + endchar + + + 51 316 200 rmoveto + 26 29 21 43 13 57 13 57 -2 48 -19 38 -13 24 -16 20 -20 14 -20 14 -18 -4 -16 -22 -27 -36 -19 -46 -59 callsubr + -35 19 -9 33 -16 38 18 19 16 rrcurveto + 5 6 7 -10 8 -24 rrcurveto + 12 -36 1 0 0 vvcurveto + -11 -9 -60 -14 -15 -6 -62 -14 -48 -18 -34 -35 -48 -50 -18 -69 -32 -69 21 -2 rcurveline + 31 77 57 30 84 22 50 13 45 23 28 35 rrcurveto + endchar + + + 314 249 224 rmoveto + -11 -9 -17 -9 -23 -9 -106 callsubr + -30 -14 -35 -13 -26 -18 rrcurveto + 0 -2 -1 -6 -5 vhcurveto + -39 -29 -42 -33 -18 -50 45 -33 rcurveline + 1 5 5 0 vhcurveto + 30 21 37 22 32 20 rrcurveto + 1 vlineto + 4 3 3 1 2 1 33 17 35 31 21 23 21 30 17 30 10 30 27 71 -2 68 -31 63 -13 24 -16 20 19 callsubr + rrcurveto + -10 -18 -2 -35 19 -9 33 -17 39 17 19 17 15 13 18 -94 1 -5 rrcurveto + -1 -2 0 -1 -2 vvcurveto + endchar + + + 18 285 149 rmoveto + 26 29 20 44 13 57 13 57 -2 47 -19 38 -13 24 -16 20 -20 14 -20 14 -18 -4 -17 -22 -27 -36 -18 -46 -22 -41 -10 -18 -1 -35 18 -9 33 -17 39 18 19 16 rrcurveto + 11 13 20 -74 1 -2 -16 -11 -24 -5 -22 -4 -60 -15 -44 -12 -28 38 callsubr + -23 -7 -31 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 11 17 rrcurveto + 1 hlineto + 16 15 19 13 25 12 66 29 79 12 45 51 rrcurveto + endchar + + + 356 522 280 rmoveto + 25 23 14 69 callgsubr + -10 -20 7 hvcurveto + 12 -36 -43 -38 -102 -26 -74 -16 rlinecurve + -15 -68 -78 -15 -73 hhcurveto + -50 -34 13 32 -17 hvcurveto + -4 8 -3 10 12 vvcurveto + 29 14 40 26 52 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -23 -103 callgsubr + -22 -20 vvcurveto + -55 -98 callsubr + 19 20 -1 23 hhcurveto + 21 22 2 2 24 hvcurveto + 106 10 103 30 81 39 91 44 52 56 26 104 rrcurveto + 5 21 2 19 19 vvcurveto + 29 -6 27 -12 25 vhcurveto + 45 callsubr + -8 3 -7 hhcurveto + -11 -11 -7 -14 -10 hvcurveto + -27 -37 -18 -45 81 callgsubr + 19 -11 25 vhcurveto + endchar + + + -152 -42 callsubr + + + 671 416 1 rmoveto + 110 4 107 20 90 30 114 38 72 51 42 112 23 62 -1 56 -25 51 -63 callgsubr + -36 -19 -46 -22 -41 -11 -18 0 -35 19 -9 rrcurveto + 33 -16 38 17 19 16 6 6 7 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + -17 -15 -35 -17 -54 -19 -54 -19 -36 -10 -17 -4 -72 -16 -80 -8 -80 -6 -96 callsubr + 62 callgsubr + 19 18 17 61 58 75 42 90 28 rrcurveto + 22 callgsubr + -38 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 61 -66 140 -34 156 5 rrcurveto + endchar + + + -81 404 415 -65 callsubr + -51 -60 -43 -74 -34 -77 -180 -27 rcurveline + -19 -129 97 21 137 34 57 16 47 31 35 44 rlinecurve + 2 callsubr + -142 -201 -54 callgsubr + 15 29 32 10 21 callsubr + -26 -12 -23 -7 -21 -2 rrcurveto + -9 4 -14 14 14 vvcurveto + endchar + + + 11 56 1 rmoveto + 81 -8 146 42 60 22 52 18 42 30 33 43 33 43 26 46 19 51 16 61 -9 -9 callsubr + -47 -55 -42 -69 -38 -83 -43 -16 -69 -17 -57 6 rrcurveto + -49 4 -28 16 -7 26 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 rrcurveto + 370 288 13 callsubr + -3 -16 -16 -7 -26 -12 -23 -7 -21 -2 -13 7 -19 22 15 20 18 24 15 28 32 10 rrcurveto + endchar + + + -75 241 38 rmoveto + 113 32 68 98 39 107 31 121 -84 42 -75 -88 -51 -60 -42 -70 -35 -78 -40 -7 -40 -13 -41 10 -25 6 -14 32 4 30 rrcurveto + 4 -2 2 -4 -6 vhcurveto + -41 -57 -30 -105 66 -32 45 -22 117 44 41 10 rrcurveto + 98 238 rmoveto + 26 -10 29 -66 -32 -15 -22 -11 -25 -7 -24 -2 -15 8 -15 22 13 18 18 24 15 28 32 11 rrcurveto + endchar + + + 127 213 11 rmoveto + 36 6 52 10 67 16 67 16 49 17 31 21 69 45 49 76 30 83 -96 callgsubr + -48 -55 -42 -70 -37 -83 -59 -21 -65 -8 -72 -7 rrcurveto + -71 -7 -87 0 -15 51 -101 callgsubr + 45 -4 52 3 60 10 rrcurveto + 328 291 51 callgsubr + -26 -12 -23 -6 -21 -72 callsubr + 29 31 10 rrcurveto + endchar + + + -45 271 159 rmoveto + 57 16 46 30 35 44 35 44 27 49 20 54 -96 callgsubr + -49 -57 -43 -69 -36 -82 -43 -8 -31 -11 -22 -15 -22 -15 -26 -29 -28 -44 rrcurveto + -35 -53 -21 -46 -7 -37 rrcurveto + -104 callgsubr + 31 49 43 40 55 28 52 27 18 -2 60 15 rrcurveto + 98 238 8 callsubr + -8 -22 -1 -14 7 -17 75 callgsubr + 14 28 32 11 rrcurveto + endchar + + + 147 463 143 rmoveto + 57 16 47 30 35 44 35 44 28 49 19 54 16 61 -9 -9 callsubr + -48 -55 -42 -70 -37 -83 -59 -11 -47 -15 -36 -19 -73 -39 -46 -56 -38 -76 rrcurveto + -19 -39 -22 -45 -25 -50 7 callgsubr + 32 68 24 55 19 42 37 83 44 50 84 34 41 17 59 17 76 18 rrcurveto + 99 238 rmoveto + 13 -5 10 -15 9 -24 9 -24 -3 -15 -16 -7 -25 -12 -24 -8 -21 -1 -13 7 -19 21 15 20 18 24 15 28 32 11 rrcurveto + endchar + + + -19 -41 callsubr + + + -94 248 115 rmoveto + 18 6 21 12 25 19 60 45 42 70 28 76 -96 callgsubr + -52 -61 -40 -70 -35 -77 -36 -6 -40 -12 -25 -19 -25 -19 -21 -31 -19 -44 rrcurveto + -4 -11 -8 -10 -4 -10 -3 -10 -1 -6 -1 -2 40 -30 rcurveline + 19 23 23 22 23 17 16 11 13 7 11 5 29 12 48 10 26 8 rrcurveto + 72 229 15 callsubr + -25 -8 -21 -1 -13 7 -16 22 13 20 18 24 15 27 31 11 rrcurveto + endchar + + + -50 435 444 -65 callsubr + -49 -56 -43 -69 -36 -82 -20 -4 rcurveline + -1 hlineto + -2 -4 -13 0 -4 -1 rrcurveto + -2 -1 hlineto + -86 -9 -24 -5 -45 -74 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 14 14 24 10 33 7 33 7 31 8 29 8 rrcurveto + 1 1 vlineto + 11 3 11 3 11 2 75 17 54 28 43 54 2 callsubr + -141 -200 -54 callgsubr + 14 27 32 11 rrcurveto + 13 -6 25 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -25 -12 -24 -7 -22 -2 rrcurveto + -9 4 -13 14 15 vvcurveto + endchar + + + 176 677 435 -65 callsubr + -48 -56 -43 -69 -37 -82 -30 -8 -42 -11 -56 -14 rrcurveto + -13 -52 -48 -7 -45 hhcurveto + -52 -39 13 30 -23 hvcurveto + -8 10 -4 13 16 vvcurveto + 29 13 38 24 49 vhcurveto + -88 callsubr + 1 -2 -2 -1 -1 -2 -1 vhcurveto + -64 callgsubr + -39 9 41 -17 58 hhcurveto + 19 23 1 3 27 hvcurveto + 45 5 47 7 49 10 79 16 105 25 56 31 79 43 54 82 32 89 26 callsubr + -141 -201 -54 callgsubr + 14 28 32 11 21 callsubr + -24 -12 -24 -7 -22 -2 rrcurveto + -9 4 -13 14 14 vvcurveto + endchar + + + -19 -41 callsubr + + + -26 223 43 rmoveto + 84 87 17 112 -44 109 -39 95 -68 102 -56 -121 -29 -63 -97 -292 53 -49 47 -44 96 26 36 38 rrcurveto + 32 134 rmoveto + 7 -25 -126 -34 -55 36 -40 26 65 121 28 26 12 11 18 2 14 -10 31 -23 36 -92 10 -38 rrcurveto + endchar + + + -99 172 30 rmoveto + 59 61 12 78 -31 77 -27 66 -48 72 -39 -85 -20 -44 -68 -205 37 -34 33 -31 67 19 25 26 rrcurveto + 23 94 rmoveto + 4 -18 -88 -23 -38 25 -28 18 45 85 20 18 8 8 13 1 10 -7 21 -16 26 -64 7 -27 rrcurveto + endchar + + + -99 172 299 rmoveto + 59 61 12 78 -31 77 -27 66 -48 72 -39 -85 -20 -44 -68 -205 37 -34 33 -31 67 19 25 26 rrcurveto + 23 94 rmoveto + 4 -18 -88 -23 -38 25 -28 18 45 85 20 18 8 8 13 1 10 -7 21 -16 26 -64 7 -27 rrcurveto + endchar + + + 80 401 310 rmoveto + -44 97 -111 80 -81 69 -14 -46 -7 -23 -8 -48 8 -7 2 -2 9 -7 -43 -69 -102 -206 24 -82 47 -163 115 189 67 -50 76 -56 113 175 -51 149 rrcurveto + -25 -133 rmoveto + -11 -16 -26 -21 -20 7 -98 35 13 -59 -81 -10 -149 -19 126 256 42 60 81 -70 86 -59 37 -104 rrcurveto + endchar + + + -99 258 217 rmoveto + -31 68 -78 56 -57 48 -9 -32 -5 -16 -6 -34 6 -5 1 -1 7 -5 -31 -48 -71 -144 17 -58 33 -114 80 132 47 -35 53 -39 79 123 -35 104 rrcurveto + -18 -93 rmoveto + -8 -11 -18 -15 -14 5 -68 24 9 -41 -57 -7 -104 -13 88 179 29 42 57 -49 60 -41 26 -73 rrcurveto + endchar + + + -99 258 486 rmoveto + -31 68 -78 56 -57 48 -9 -32 -5 -16 -6 -34 6 -5 1 -1 7 -5 -31 -48 -71 -144 17 -58 33 -114 80 132 47 -35 53 -39 79 123 -35 104 rrcurveto + -18 -93 rmoveto + -8 -11 -18 -15 -14 5 -68 24 9 -41 -57 -7 -104 -13 88 179 29 42 57 -49 60 -41 26 -73 rrcurveto + endchar + + + -6 269 38 rmoveto + 23 36 19 39 22 36 rrcurveto + -5 3 -2 -1 0 vvcurveto + -37 -23 -49 -16 -56 9 -38 7 -39 15 -7 36 58 93 63 62 -109 68 -8 5 -4 10 3 9 11 32 37 11 24 18 15 34 13 35 19 29 -10 -3 -6 -4 -7 -4 rrcurveto + -64 -40 -47 -75 -34 -65 -72 -137 90 46 27 -71 -16 -49 -25 -36 -23 -39 -14 -25 9 -36 18 -16 53 -47 120 9 48 45 rrcurveto + endchar + + + -99 194 27 rmoveto + 16 25 14 27 15 25 rrcurveto + -3 2 -2 0 0 vvcurveto + -26 -16 -34 -12 -39 7 -27 5 -27 10 -5 25 41 65 44 44 -77 47 -5 4 -3 7 2 6 8 23 26 7 17 13 10 24 9 24 13 21 -7 -3 -4 -2 -5 -3 rrcurveto + -44 -28 -33 -53 -24 -45 -51 -96 63 32 19 -50 -11 -34 -17 -25 -16 -27 -10 -18 6 -25 13 -11 37 -33 84 6 33 32 rrcurveto + endchar + + + -99 194 296 rmoveto + 16 25 14 27 15 25 rrcurveto + -3 2 -2 0 0 vvcurveto + -26 -16 -34 -12 -39 7 -27 5 -27 10 -5 25 41 65 44 44 -77 47 -5 4 -3 7 2 6 8 23 26 7 17 13 10 24 9 24 13 21 -7 -3 -4 -2 -5 -3 rrcurveto + -44 -28 -33 -53 -24 -45 -51 -96 63 32 19 -50 -11 -34 -17 -25 -16 -27 -10 -18 6 -25 13 -11 37 -33 84 6 33 32 rrcurveto + endchar + + + 50 219 4 rmoveto + 71 106 -16 135 -64 105 -2 3 10 4 14 -2 107 -18 40 85 11 129 1 8 -10 -17 -1 -4 -7 -34 -103 -76 -42 76 -8 15 28 55 64 -30 39 -18 18 79 -68 -4 rrcurveto + -35 -2 -92 -78 3 -62 -74 14 3 21 -32 62 -19 -38 -15 -41 -15 -39 21 -50 34 -39 27 -42 52 -80 64 -94 -14 -135 rrcurveto + -2 8 4 2 4 vhcurveto + endchar + + + -99 141 3 rmoveto + 50 74 -11 95 -45 73 -1 2 7 3 9 -2 75 -12 28 59 8 91 1 5 -7 -12 -1 -2 -5 -24 -72 -53 -29 53 -6 10 20 39 44 -21 28 -13 12 56 -47 -3 rrcurveto + -25 -2 -64 -54 2 -44 -52 10 2 15 -22 43 -13 -26 -11 -29 -10 -27 14 -35 24 -28 19 -29 36 -56 45 -66 -10 -94 -85 callgsubr + + + -99 141 272 rmoveto + 50 74 -11 95 -45 73 -1 2 7 3 9 -1 75 -13 28 59 8 91 1 5 -7 -12 -1 -2 -5 -24 -72 -53 -29 53 -6 10 20 39 44 -21 28 -13 12 56 -47 -3 rrcurveto + -25 -2 -64 -54 2 -44 -52 10 2 15 -22 43 -13 -26 -11 -29 -10 -27 14 -35 24 -28 19 -29 36 -56 45 -66 -10 -94 -85 callgsubr + + + 34 263 346 rmoveto + 1 vlineto + 21 30 49 108 41 129 -103 -35 rcurveline + -34 -96 -37 49 -42 59 -30 -3 rlinecurve + -113 -13 -8 -212 52 -89 39 -66 51 -101 -12 -107 6 4 3 5 1 5 17 64 31 63 -9 78 -22 79 -54 84 -29 72 51 71 81 -172 41 -12 3 -1 3 3 3 3 rrcurveto + endchar + + + -99 176 242 rmoveto + 1 vlineto + 15 21 34 76 29 90 -72 -25 rcurveline + -24 -67 -26 34 -29 42 -21 -2 rlinecurve + -94 callsubr + 35 50 57 -121 29 -8 2 -1 2 -86 callsubr + + + -99 176 511 rmoveto + 1 vlineto + 15 21 34 76 29 90 -72 -25 rcurveline + -24 -67 -26 34 -29 42 -21 -2 rlinecurve + -94 callsubr + 35 50 57 -121 29 -8 2 -1 2 -86 callsubr + + + -111 62 99 rmoveto + -40 -99 165 20 45 99 rlineto + endchar + + + 580 562 856 rmoveto + -31 -52 300 172 31 52 rlineto + -375 -880 -82 callsubr + + + -132 -58 rmoveto + -31 -52 300 172 31 52 rlineto + endchar + + + 319 272 769 -107 callsubr + -66 -507 -20 callgsubr + + + 319 -73 callgsubr + endchar + + + -176 387 395 rmoveto + -34 -32 -53 -34 -39 -28 -79 -61 rcurveline + -45 -41 -44 -65 -44 -88 -44 -88 -15 -79 15 -71 14 -65 34 -46 53 -26 121 -59 144 26 116 54 67 31 53 40 41 49 2 2 -1 1 -4 -1 -4 -1 -3 0 -3 -1 rrcurveto + -18 -7 -48 -10 -78 -13 -52 -9 -52 -3 -52 2 -117 4 -92 35 -61 69 -20 22 -2 29 16 34 34 73 67 73 59 53 32 29 24 22 14 12 40 35 43 37 32 44 rrcurveto + 13 19 16 35 18 51 18 51 -7 33 -33 14 rrcurveto + 10 -25 -39 4 -53 hhcurveto + -53 -36 -2 -4 -16 hvcurveto + -16 -24 -34 -56 -9 -42 -3 -15 4 -7 12 3 rrcurveto + 4 23 34 2 46 hhcurveto + 46 38 -3 -7 31 hvcurveto + 2 -1 3 -4 3 -9 rrcurveto + endchar + + + 194 21 124 rmoveto + -21 -124 8 1 6 2 8 2 rlinecurve + 2 1 1 2 hhcurveto + 22 6 25 4 23 4 rrcurveto + 1 vlineto + 21 4 19 4 16 3 rrcurveto + -2 -10 -6 -18 -10 vvcurveto + -4 2 -2 4 20 3 39 13 6 vhcurveto + 105 27 84 14 99 31 64 138 rcurveline + -5 -9 -9 -2 -8 hhcurveto + -12 -11 5 10 -9 hvcurveto + -7 25 -10 23 -11 21 rrcurveto + 26 -14 -27 27 39 callsubr + -42 -95 -27 -75 -60 -11 -60 -10 -60 -11 rrcurveto + 352 74 rmoveto + 1 -2 0 -2 -2 vvcurveto + -3 -2 -2 -4 -1 vhcurveto + -142 -28 14 35 12 23 callgsubr + 13 -18 10 -23 rrcurveto + endchar + + + 261 267 145 rmoveto + -67 -10 -141 -34 -20 74 -14 -37 -13 -42 -12 -48 1 -30 28 -14 27 -3 72 -7 28 11 61 13 -2 -12 -15 -36 19 7 16 6 3 29 7 14 105 27 83 16 99 32 64 137 rcurveline + -24 -10 -18 2 -15 16 -14 48 -21 46 -40 20 -24 12 -23 -2 -21 -14 -61 -42 -41 -94 -27 -75 rrcurveto + 171 41 rmoveto + 3 -7 -2 -4 -6 -1 -141 -28 rcurveline + 84 callgsubr + 44 39 37 -60 13 -30 rrcurveto + endchar + + + 272 277 144 rmoveto + -120 -20 -37 3 -20 6 -33 10 -22 34 5 37 rrcurveto + 2 -3 1 -1 -3 vhcurveto + -84 -159 8 -102 257 67 -2 -11 -4 -15 -2 -8 -1 -5 6 -6 4 1 20 5 -1 32 7 13 107 23 104 28 78 25 63 136 rcurveline + -21 -9 -23 2 -13 15 -12 51 -22 43 -38 21 -96 52 -78 -197 -26 -72 rrcurveto + 170 42 rmoveto + 3 -7 2 -3 -11 -2 -140 -28 rcurveline + 16 34 13 38 28 23 17 14 23 -4 15 -13 16 -14 10 -17 8 -21 rrcurveto + endchar + + + 427 425 168 rmoveto + -71 -17 -102 -19 -82 -4 -59 -4 -59 8 -13 44 -13 -34 -13 -43 -13 -51 -91 callsubr + 100 -10 135 32 84 18 -2 -12 -15 -32 19 2 16 6 3 30 7 14 rrcurveto + 105 27 83 17 99 31 64 137 rcurveline + -23 -11 -19 3 -15 17 -14 48 -21 46 -40 20 -24 12 -23 -2 -21 -14 -61 -42 -42 -96 -26 -75 rrcurveto + 171 42 rmoveto + 3 -7 -2 -3 -6 -1 -141 -29 rcurveline + 84 callgsubr + 44 39 37 -59 13 -31 rrcurveto + endchar + + + 150 5 vmoveto + -104 callgsubr + 8 13 16 22 25 28 25 28 53 35 83 42 83 42 58 44 35 44 35 44 24 48 13 51 13 51 -9 31 -33 14 -32 13 -39 4 -45 -7 -45 -7 -33 -12 -22 -15 rrcurveto + -33 -23 -23 -42 -14 -61 -14 -61 5 -39 21 -19 -29 -17 -25 -19 -22 -21 -50 -48 -25 -80 -16 -80 rrcurveto + 399 383 rmoveto + -3 -3 0 0 0 vvcurveto + -43 -31 -42 -20 -49 -20 rrcurveto + -1 1 -1 1 1 vvcurveto + -14 28 -20 22 -11 31 14 11 29 9 45 6 49 6 35 -10 12 -32 rrcurveto + endchar + + + 268 47 -242 rmoveto + 45 97 42 72 39 49 74 92 69 52 87 71 39 32 41 48 45 62 13 19 17 35 10 callsubr + -33 -12 -22 -15 rrcurveto + -33 -24 -23 -42 -12 -62 -12 -62 12 -51 37 -41 -3 -3 rcurveline + -45 -36 -36 -35 -27 -35 -52 -67 -42 -79 -39 -78 -9 -18 rcurveline + 4 29 1 2 -54 -66 -3 -39 63 callgsubr + 8 -23 15 29 18 36 rrcurveto + 339 533 rmoveto + -16 35 -28 31 -14 38 15 12 32 9 49 5 49 5 29 -12 10 -30 -34 -32 -54 -33 -38 -28 rrcurveto + endchar + + + 187 48 -240 rmoveto + 32 70 39 55 49 50 44 46 47 41 48 38 48 38 47 51 45 63 13 19 16 35 10 callsubr + -34 -11 -21 -16 rrcurveto + -33 -23 -23 -42 -12 -62 -12 -62 13 -51 37 -42 -1 -1 -2 -1 -1 -1 -58 -46 -44 -50 -29 -56 -10 -19 -8 -21 -11 -18 -7 -15 rcurveline + 47 callsubr + -4 -42 2 -29 6 -17 rlinecurve + 8 -23 16 30 18 35 rrcurveto + 256 409 rmoveto + -16 36 -27 31 -15 37 15 12 32 10 49 5 49 5 29 -12 10 -29 -34 -32 -53 -35 -39 -28 rrcurveto + endchar + + + 203 243 250 rmoveto + -95 -30 -57 -30 -20 -29 -36 -53 -14 -45 -21 -61 21 -2 rcurveline + 19 46 51 34 55 17 51 16 68 32 42 18 102 44 82 83 37 109 rrcurveto + 8 24 5 25 23 vvcurveto + 23 -9 16 -19 8 vhcurveto + -32 13 -39 3 -45 -7 -45 -7 -33 -11 -22 -15 -28 -20 -21 -34 -14 -48 -14 -48 3 -47 20 -47 rrcurveto + 94 37 rmoveto + -21 27 -16 30 -13 33 15 12 32 9 49 5 49 5 29 -11 10 -30 -34 -32 -54 -28 -46 -20 rrcurveto + endchar + + + 314 173 206 rmoveto + -3 -3 -9 -4 -15 -7 -27 -12 -22 -14 -20 -15 -24 -19 -18 -22 -11 -24 -6 -13 -15 -32 -3 -13 42 -29 rcurveline + 17 14 29 13 16 14 18 13 20 14 25 15 44 26 42 25 42 25 42 25 41 39 39 55 13 19 16 35 18 51 18 51 -8 33 -33 14 -32 13 -38 4 -45 -7 rrcurveto + -45 -7 -33 -12 -22 -15 -35 -25 -26 -57 -11 -50 -9 -44 -2 -58 30 -16 rrcurveto + 100 29 rmoveto + -16 36 -27 31 -14 37 15 12 31 9 49 5 49 5 30 -11 10 -30 -34 -32 -54 -34 -39 -28 rrcurveto + endchar + + + 180 18 hmoveto + 6 5 5 9 7 hvcurveto + 19 19 37 19 54 21 51 16 68 31 42 18 102 44 82 84 37 109 rrcurveto + 8 24 5 24 23 vvcurveto + 23 -9 16 -19 8 vhcurveto + -32 13 -39 4 -45 -7 -45 -7 -33 -12 -22 -15 -50 -36 -44 -112 35 -89 -45 -20 -43 -21 -44 -21 -44 -21 -30 -39 -17 -55 77 callgsubr + 9 -13 9 vhcurveto + 319 262 rmoveto + -21 27 -16 31 -13 33 15 12 32 9 49 5 49 5 29 -12 10 -30 -34 -32 -54 -28 -46 -20 rrcurveto + endchar + + + 433 106 333 rmoveto + -2 -1 0 -14 callsubr + -42 9 49 -15 60 hhcurveto + 31 35 4 8 40 hvcurveto + 60 11 50 10 42 9 rrcurveto + -2 -10 -6 -16 -10 vvcurveto + -4 3 -2 5 vhcurveto + 2 hlineto + 16 6 3 30 6 14 105 27 84 17 99 31 64 137 rcurveline + -5 -9 -9 -2 -8 hhcurveto + -12 -11 6 10 -9 hvcurveto + -7 25 -9 22 -12 21 rrcurveto + 26 -15 -26 28 39 callsubr + -43 -96 -26 -75 -41 -6 -47 -8 -52 -11 rrcurveto + -8 -40 -35 -5 -32 hhcurveto + -53 -37 13 35 -17 hvcurveto + -4 7 -2 9 11 24 callsubr + 3 -3 0 -2 vhcurveto + 494 -121 rmoveto + 1 -2 0 -2 -1 vvcurveto + -4 -2 -2 -4 -1 vhcurveto + -141 -28 14 35 11 23 callgsubr + 12 -18 11 -23 rrcurveto + endchar + + + 150 5 vmoveto + -104 callgsubr + 8 13 25 25 42 36 42 36 54 37 69 39 69 39 55 49 40 60 13 19 16 36 18 51 18 51 -7 32 -33 14 -32 13 -39 4 -45 -7 -45 -7 -33 -12 -22 -15 rrcurveto + -33 -23 -23 -42 -14 -61 -14 -61 5 -39 21 -19 -29 -17 -25 -19 -22 -21 -50 -48 -25 -80 -16 -80 rrcurveto + 399 383 rmoveto + -3 -3 0 0 0 vvcurveto + -43 -31 -42 -20 -49 -20 rrcurveto + -1 1 -1 1 1 vvcurveto + -14 28 -20 22 -11 31 14 11 29 9 45 6 49 6 35 -10 12 -32 rrcurveto + endchar + + + -83 393 238 rmoveto + -90 -52 -122 -36 -154 -20 rrcurveto + -1 -3 vlineto + -24 -129 4 1 8 2 11 2 rlinecurve + 211 54 130 64 49 74 29 45 21 35 23 54 8 18 -3 14 -12 9 -18 14 -32 10 -46 7 -46 7 -34 3 -21 -1 -18 -38 -19 -35 -17 -93 callgsubr + rrcurveto + 13 -3 21 -2 30 -1 36 -1 68 -3 7 -24 -2 -3 -3 -3 -6 -3 rrcurveto + endchar + + + 31 507 231 rmoveto + -94 -50 -94 -37 -117 -15 -52 -7 -39 2 -27 10 -24 8 -15 14 -6 21 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 55 -5 55 2 55 9 132 23 111 62 63 95 rrcurveto + 29 45 21 35 23 54 7 18 -2 -43 callgsubr + -31 9 -45 4 -45 4 -35 3 -23 6 -18 -38 -19 -35 -17 -93 callgsubr + 13 -3 22 -1 30 -1 rrcurveto + 30 -1 26 -56 callgsubr + -2 -3 -3 -3 -6 -3 rrcurveto + endchar + + + -73 47 9 rmoveto + 65 -36 203 73 94 110 38 44 35 57 16 49 7 21 -3 15 -10 8 -18 14 -33 8 -45 4 -45 4 -34 6 callgsubr + 36 -9 3 -10 -21 -13 -187 -99 -163 -24 15 111 rrcurveto + 8 -2 0 -5 -8 vhcurveto + -32 -43 -52 -109 71 -39 rrcurveto + endchar + + + 74 246 16 rmoveto + 44 8 39 9 35 11 107 33 66 55 57 86 21 31 25 42 9 40 4 16 -3 11 -8 7 -19 15 -40 6 -32 5 -33 5 -45 2 -28 7 rrcurveto + -1 hlineto + -18 -38 -19 -35 -16 -39 -6 -12 1 -6 6 -1 13 -3 21 -1 30 -1 36 -1 67 -3 7 -24 -2 -3 -2 -3 -6 -3 -90 -48 -97 -31 -121 -17 -71 -10 -121 -10 -17 60 rrcurveto + -101 callgsubr + 49 -5 64 5 77 14 rrcurveto + endchar + + + -96 174 261 rmoveto + -32 -8 -29 -15 -25 -23 -17 -16 -15 -21 -12 -26 -16 -33 -14 -49 -14 -65 rrcurveto + -104 callgsubr + 26 49 39 33 47 25 52 28 62 17 48 32 43 27 37 39 33 50 29 46 22 34 22 54 7 18 -1 -59 callgsubr + -34 4 -23 48 callsubr + -40 -5 -11 0 -7 6 -1 13 -3 22 -2 30 -1 30 -1 27 -2 21 -5 19 -5 11 -6 3 -8 -1 -2 -4 -4 -6 -4 -74 -38 -52 -24 -80 -20 rrcurveto + endchar + + + 89 146 -51 rmoveto + 38 68 100 71 160 74 59 28 45 40 36 56 29 45 22 35 22 54 7 18 -1 -59 callgsubr + -35 6 callgsubr + 20 -5 10 -6 2 -8 -1 -3 -3 -2 -6 -3 -49 -26 3 -1 -53 -15 rrcurveto + -55 -16 -46 -13 -45 -25 -118 -65 -77 -145 -62 -125 -9 -18 rcurveline + 4 30 rlineto + -23 callsubr + 31 62 31 64 40 71 rrcurveto + endchar + + + 27 520 184 rmoveto + 32 37 1 4 30 52 16 28 0 19 -15 9 -45 28 -118 35 -63 11 -21 -41 -3 -8 -22 -54 -5 -10 0 -5 5 -1 56 -10 86 -28 42 -24 -2 -1 -2 -2 -2 -1 rrcurveto + -1 hlineto + -29 -15 -35 -11 -41 -7 -35 -6 -34 -9 -32 -13 -70 -28 -57 -56 -34 -65 -18 -35 -20 -39 -21 -41 -1 -2 rcurveline + -7 -15 47 callsubr + -5 -37 1 -29 8 -22 rlinecurve + 44 callsubr + 8 20 10 20 11 26 12 27 10 25 11 25 32 72 42 47 70 28 44 18 60 10 48 20 40 17 49 42 29 35 rrcurveto + endchar + + + -58 18 hmoveto + 3 hlineto + 2 5 2 5 4 6 16 25 20 23 25 18 37 24 63 28 49 19 85 33 65 44 48 73 29 45 21 34 23 54 8 18 -2 15 -12 9 -18 14 -32 8 -45 4 rrcurveto + -45 4 -34 4 -23 6 -1 -1 rcurveline + -19 -39 -18 -33 -17 -40 -5 -11 0 -6 6 -1 38 -9 126 11 11 -36 -69 callsubr + -50 -27 8 2 -56 -16 -50 -15 -43 -11 -44 -16 -48 -17 -35 -23 -22 -29 rrcurveto + -21 -28 -19 -44 -16 -60 -6 -25 -5 -11 -10 -22 11 -1 rcurveline + 1 -1 3 -1 3 1 rrcurveto + endchar + + + -166 318 274 rmoveto + -91 -48 8 9 -89 -41 -61 -29 -41 -35 -20 -42 -3 -6 -14 -34 -3 -6 -1 -3 -1 -4 -2 -5 42 -30 rcurveline + 17 13 29 15 16 14 28 21 23 14 20 7 42 15 32 23 31 33 16 18 19 26 22 34 20 31 20 28 16 34 9 19 13 16 -1 29 -1 7 -3 7 -6 4 rrcurveto + -18 14 -32 12 -45 10 -45 10 -33 8 -23 6 rrcurveto + -1 hlineto + -18 -38 -19 -35 -17 -93 callgsubr + 56 -13 54 -9 51 -18 8 -4 5 -4 1 -6 -1 -3 -4 -3 -6 -3 rrcurveto + endchar + + + -85 392 288 rmoveto + -36 -19 -33 -15 -27 -11 -53 -23 -57 -14 -55 -21 -28 -11 -42 -18 -14 -21 -16 -23 -4 -30 -13 -27 -93 callsubr + 38 38 70 22 57 22 98 37 62 35 52 80 29 45 22 35 22 54 7 18 -1 -43 callgsubr + -33 8 -45 4 rrcurveto + -45 4 -34 4 -23 6 -18 -38 -19 -35 -17 -93 callgsubr + 13 -3 22 -2 30 -1 36 -1 68 -3 6 -24 -1 -3 -3 -2 -6 -4 rrcurveto + endchar + + + 177 83 7 rmoveto + 119 -18 124 16 127 50 127 50 92 83 56 115 5 9 6 14 7 18 7 18 -2 -59 callgsubr + -35 4 -22 6 -19 -38 -19 -34 -16 -40 rrcurveto + -6 -11 0 -7 7 -1 13 -3 21 -1 30 -1 30 -1 27 -56 callgsubr + -1 -1 -4 -4 -6 -5 -22 -12 -19 -9 -18 -6 -73 -26 -78 -24 -86 -20 rrcurveto + -101 -23 -119 -12 -45 67 -19 28 8 48 34 68 28 callsubr + -10 -14 -15 -23 -56 callsubr + -15 -34 -11 -36 -11 -36 -2 -32 7 -30 rrcurveto + 7 -30 23 -18 43 -6 rrcurveto + endchar + + + -77 12 2 rmoveto + 30 56 52 39 63 27 76 32 77 24 60 50 16 13 19 23 21 33 35 54 9 15 22 53 7 18 -2 -43 callgsubr + -32 9 -45 4 -45 4 -34 3 -22 48 callsubr + -39 -5 -12 0 -6 6 -1 13 -3 22 -2 30 -1 30 -1 26 -56 callgsubr + -1 -2 -5 -2 -9 -3 -72 -23 -75 -21 -71 -24 rrcurveto + -68 -23 -37 -27 -30 -65 -15 -32 -14 -48 -13 -63 -105 callsubr + endchar + + + 67 84 hmoveto + 39 46 6 12 25 hvcurveto + 34 16 29 38 30 41 28 39 26 32 -2 19 -5 51 -72 -16 -26 46 28 24 23 8 38 10 8 15 25 30 10 17 rrcurveto + 17 10 12 23 -14 hhcurveto + -14 -35 -20 -11 -15 hvcurveto + -91 -63 -91 -118 26 -45 11 -19 27 -19 35 -8 17 -4 11 -10 -24 -12 -48 -24 -80 -28 -44 -28 rrcurveto + -16 -25 18 -3 30 hhcurveto + endchar + + + 10 -47 -106 callgsubr + endchar + + + 10 -47 -106 callgsubr + endchar + + + -117 -79 callsubr + + + -168 78 135 rmoveto + 8 9 1 3 9 hvcurveto + 32 9 27 17 21 24 13 -189 rcurveline + 74 138 -18 263 rlineto + 44 -12 26 -25 10 vhcurveto + 2 -6 -6 2 -7 hhcurveto + -20 -22 -12 -23 -25 hvcurveto + -9 -8 -14 -18 -18 -26 -33 -47 -37 -65 -15 -61 rrcurveto + -2 -9 -2 -9 -8 vvcurveto + -41 46 -23 32 vhcurveto + 93 153 rmoveto + -7 -1 -7 -1 -6 vhcurveto + -3 -11 -10 -2 -10 hhcurveto + -32 -27 14 20 -10 hvcurveto + -3 5 -2 5 4 vvcurveto + 5 2 4 4 5 vhcurveto + 8 10 10 9 12 10 rrcurveto + 7 8 8 3 10 hhcurveto + 38 7 -36 -40 hvcurveto + endchar + + + 221 343 391 rmoveto + -15 -17 76 callgsubr + -148 -24 rcurveline + -23 -130 60 16 61 11 60 16 rlinecurve + -1 vlineto + 2 2 7 0 2 hhcurveto + 11 hlineto + 151 81 67 101 66 hvcurveto + 30 46 17 41 4 38 rrcurveto + 1 11 1 11 11 vvcurveto + 17 -2 16 -3 17 vhcurveto + -5 28 -4 30 -5 31 -7 45 -13 29 -18 12 rrcurveto + 8 -12 -13 3 -13 hhcurveto + -8 -8 57 callgsubr + -30 -32 -15 -43 rrcurveto + -1 -1 0 0 vhcurveto + -3 3 -12 callsubr + 6 2 6 hhcurveto + 20 17 -18 -78 callgsubr + 13 -70 74 callgsubr + -15 59 callgsubr + 11 13 vvcurveto + 28 -20 57 -31 vhcurveto + -117 -201 rmoveto + 3 1 3 -11 callsubr + -17 -15 -23 -12 -28 -8 rlinecurve + -1 hlineto + -6 -12 13 9 hvcurveto + endchar + + + 338 445 389 rmoveto + -15 -16 76 callgsubr + rrcurveto + -2 vlineto + -66 -14 -147 -38 -22 77 -78 callsubr + 41 -4 40 3 38 10 38 10 39 10 40 10 rrcurveto + 1 1 1 1 hhcurveto + 1 11 vlineto + 151 81 67 101 66 hvcurveto + 30 46 16 41 4 38 rrcurveto + 1 11 1 11 11 vvcurveto + 17 -1 16 -3 17 vhcurveto + -5 28 -4 30 27 callsubr + 3 5 callsubr + -30 -32 -15 -43 rrcurveto + -1 vlineto + -3 2 -12 callsubr + 7 2 6 hhcurveto + 20 16 -18 -78 callgsubr + 14 -70 74 callgsubr + -15 59 callgsubr + 11 13 vvcurveto + 28 -21 57 -31 vhcurveto + -116 -201 rmoveto + 3 1 3 1 29 callgsubr + -14 -26 9 hvcurveto + 2 -3 -17 -15 -23 -11 -28 -8 rlinecurve + -2 hlineto + -6 -11 12 9 hvcurveto + endchar + + + 237 195 29 rmoveto + 1 7 7 1 7 hhcurveto + 90 -1 70 24 53 41 60 46 72 107 8 76 6 54 -13 55 -10 62 -29 181 -133 -106 -65 -88 -25 -34 -30 -32 -14 -43 -3 -8 20 1 6 6 31 34 22 45 44 22 rrcurveto + 29 14 24 -21 9 -19 31 -64 14 -82 -4 -94 -34 -21 -42 -16 -49 -9 16 31 17 32 15 32 28 58 -50 113 -72 -84 -50 -58 -39 -70 -31 -75 rrcurveto + 1 vlineto + -33 -7 -38 -11 -33 9 -24 6 -13 30 2 29 1 4 -5 2 -4 -6 -40 -58 -28 -101 65 -32 39 -19 81 33 37 9 rrcurveto + 52 170 rmoveto + 23 49 38 21 22 -63 rrcurveto + 0 1 -1 1 -2 vhcurveto + -18 -15 -25 -12 -25 -8 -6 -2 -18 18 7 15 rrcurveto + endchar + + + 453 422 51 rmoveto + 154 -1 82 66 67 102 30 46 16 42 4 38 6 43 callgsubr + 1 -22 -7 -48 -16 -50 -53 -28 -38 -25 -34 -31 -31 -14 -44 rrcurveto + -4 -10 25 7 3 3 16 17 14 18 14 20 14 20 17 14 22 11 30 15 22 -24 9 -16 32 -65 13 -80 -4 -96 -34 -21 -41 -15 -49 -9 16 31 15 32 16 31 rrcurveto + 14 29 -3 32 -20 36 -20 36 -29 -3 -36 -42 -50 -58 -38 -69 -31 -75 -52 -11 -88 -16 -64 -3 -62 -3 -78 3 -12 45 -13 -34 -13 -43 -13 -51 -91 callsubr + rrcurveto + 105 -11 155 36 86 22 rrcurveto + -1 3 13 3 4 hhcurveto + 117 172 rmoveto + -16 -14 -23 -12 -29 -9 -3 -1 -5 3 -6 7 -6 7 -1 -65 callgsubr + -1 1 -1 1 -1 vhcurveto + endchar + + + 263 454 217 rmoveto + 30 23 30 -77 callgsubr + 16 42 3 callsubr + 2 24 callgsubr + 7 3 3 15 17 14 17 -100 callgsubr + 30 14 24 -22 8 -17 32 -65 13 -81 -4 -95 -33 -21 -41 -15 -50 -9 18 35 16 30 14 29 rrcurveto + 14 29 -4 32 -20 36 -20 36 -29 -4 -36 -42 -47 -54 -39 -67 -33 -81 -45 -8 -46 -22 -26 -17 -26 -18 -20 -24 -13 -31 -13 -31 -13 -46 -12 -60 rrcurveto + -104 callgsubr + 24 39 22 29 31 25 32 24 47 20 45 10 rrcurveto + 3 12 10 1 7 hhcurveto + 85 -1 70 21 57 44 rrcurveto + -97 108 rmoveto + -17 -15 -22 -12 -28 -8 -3 -1 -5 3 -6 7 -6 7 -1 -65 callgsubr + 0 0 0 1 -3 vhcurveto + endchar + + + 416 387 148 rmoveto + 85 -1 71 22 57 44 30 23 29 -77 callgsubr + 16 41 4 38 7 43 callgsubr + 2 -22 -7 -48 -16 -50 -53 -29 -38 rrcurveto + -25 -33 -30 -33 -15 -43 rrcurveto + -4 -1 3 -2 7 hhcurveto + 7 5 2 3 3 hvcurveto + 15 17 14 18 14 20 14 20 18 15 22 11 30 15 22 -25 9 -16 32 -66 13 -80 -4 -94 -34 -21 -41 -15 -49 -9 16 31 16 32 16 32 14 29 -4 32 -20 35 rrcurveto + -20 35 -28 -3 -36 -42 -50 -58 -39 -68 -31 -76 rrcurveto + 1 vlineto + -3 -1 rlineto + -1 hlineto + -36 -12 -27 -17 -20 -19 -20 -19 -25 -29 -31 -40 -105 callgsubr + 41 49 44 34 54 30 rrcurveto + -1 vlineto + 4 18 15 6 22 hhcurveto + 116 172 78 callgsubr + 3 -6 7 -6 7 -2 -65 callgsubr + 0 0 -1 2 -3 vhcurveto + endchar + + + 277 466 211 rmoveto + 30 23 30 33 30 46 30 46 16 42 4 38 7 62 -14 53 32 callsubr + 3 -22 -7 -48 -16 -50 -54 -29 -38 -25 -33 72 callgsubr + 15 17 15 18 -100 callgsubr + 30 14 23 -24 9 -16 31 -66 13 -79 -4 -95 -84 callgsubr + 14 29 -4 32 -20 36 -20 36 -28 -4 -36 -42 -47 -54 -40 -68 -33 -81 -15 -4 -33 -12 -13 -6 -62 -26 -36 -46 -27 -63 -14 -31 -12 -33 -14 -32 21 -2 rcurveline + 13 31 16 25 21 19 19 17 25 13 31 12 21 8 22 7 21 7 rrcurveto + 2 1 0 1 2 hvcurveto + 74 23 14 -5 19 -5 20 3 rlinecurve + 52 8 32 16 40 31 rrcurveto + -96 107 78 callgsubr + 2 -74 callsubr + 16 17 6 17 6 13 -14 11 -31 rrcurveto + 0 1 0 1 -3 vhcurveto + endchar + + + 314 256 103 rmoveto + 86 -1 70 21 56 44 52 40 80 108 8 81 7 62 -15 53 -9 56 -7 45 -13 29 -18 12 -18 12 -21 2 -22 -7 -48 -16 -51 -53 -28 -38 -25 -34 72 callgsubr + 16 17 14 19 14 20 14 20 18 14 21 11 30 14 23 -22 8 -17 32 -65 14 -81 -5 -95 -33 -21 -41 -15 -50 -9 16 31 16 32 16 32 rrcurveto + 14 29 -4 31 -20 36 -20 36 -28 -3 -36 -42 -50 -58 -39 -69 -31 -76 -20 -5 -20 -6 -21 -8 -56 -25 -31 -33 -38 -41 -21 -24 -14 -20 -7 -18 46 -33 rcurveline + 1 2 1 1 2 2 62 39 54 51 90 9 rrcurveto + 116 171 rmoveto + -16 -14 -23 -11 -29 -9 -3 -1 -4 3 -74 callsubr + 15 17 6 18 6 15 -17 10 -31 rrcurveto + endchar + + + 224 348 425 rmoveto + -15 -17 -11 -23 -19 hvcurveto + -46 -53 -39 -66 -33 -78 rrcurveto + 1 vlineto + -1 -2 0 -2 -1 -2 rrcurveto + -1 1 hlineto + -4 -1 -5 0 -4 -1 rrcurveto + -1 hlineto + -40 -12 -30 -12 -23 -25 -21 -22 -20 -30 -14 -32 -88 callgsubr + 35 35 37 8 49 15 4 1 10 2 15 4 rrcurveto + 3 2 1 3 hhcurveto + 1 5 4 0 4 hhcurveto + 5 hlineto + 83 69 21 43 55 hvcurveto + 30 23 30 -77 callgsubr + 17 42 4 38 rrcurveto + 1 10 0 9 10 vvcurveto + 17 -1 18 -3 18 -18 callsubr + -30 -32 -14 25 callsubr + 1 rlineto + 7 6 1 10 callgsubr + 16 -18 -78 callgsubr + 14 -69 -81 vvcurveto + -11 0 -11 -1 -11 vhcurveto + -84 callgsubr + 6 11 2 12 13 vvcurveto + 28 -20 57 -31 vhcurveto + -112 -195 rmoveto + 3 1 3 1 3 vhcurveto + 11 24 14 15 17 6 rrcurveto + 1 3 2 0 2 hhcurveto + 13 12 -13 -26 9 hvcurveto + 2 -4 -18 -14 -22 -12 -28 -8 rlinecurve + -1 hlineto + -6 -12 13 9 hvcurveto + endchar + + + 543 651 413 rmoveto + -15 -17 -11 -23 -19 hvcurveto + -50 -58 -38 -68 -32 -76 -41 -8 -48 -11 -57 -12 rrcurveto + -10 -46 -42 -5 -38 hhcurveto + -58 -43 13 34 -23 hvcurveto + -7 9 -2 12 15 vvcurveto + 28 12 37 23 47 -95 callgsubr + 2 -1 0 -1 1 vhcurveto + -3 hlineto + -2 -1 0 -57 callgsubr + -22 -20 vvcurveto + -55 -98 callsubr + 18 19 0 20 hhcurveto + 43 49 6 12 54 hvcurveto + 79 17 68 15 58 15 rrcurveto + 1 hlineto + 2 7 7 0 6 hhcurveto + 6 hlineto + 150 81 68 100 65 hvcurveto + 30 46 17 41 4 38 rrcurveto + 1 10 0 11 10 vvcurveto + 51 -10 40 -8 49 vhcurveto + -7 45 -13 29 -18 12 rrcurveto + 8 -12 -12 4 -13 hhcurveto + -8 -9 57 callgsubr + -31 -32 -14 -43 rrcurveto + -1 -1 -1 0 vhcurveto + -3 3 -1 6 vhcurveto + 1 hlineto + 7 4 2 3 3 hvcurveto + 16 17 14 18 -100 callgsubr + rrcurveto + 3 7 7 2 6 hhcurveto + 20 15 -19 -12 6 hvcurveto + 28 -58 14 -68 -81 vvcurveto + -11 1 -11 -1 -11 vhcurveto + -33 -21 -42 -16 -50 -9 19 37 16 32 13 26 rrcurveto + 6 11 3 12 13 vvcurveto + 28 -21 57 -31 vhcurveto + -114 -186 rmoveto + 3 1 2 2 29 callgsubr + -13 -26 9 hvcurveto + 0 0 -2 1 -2 vhcurveto + -16 -13 -22 -11 -29 -10 rrcurveto + -2 hlineto + -6 -12 14 8 hvcurveto + endchar + + + 266 457 191 rmoveto + 30 23 29 -77 callgsubr + 17 41 3 callsubr + 3 24 callgsubr + 6 3 3 15 17 14 18 -100 callgsubr + 30 14 23 -23 8 -17 32 -65 13 -80 -4 -95 -84 callgsubr + 14 29 -3 32 -20 36 -20 36 -29 -4 -36 -42 -46 -54 -40 -67 -34 -81 -15 -4 -32 -13 -14 -6 -47 -20 -32 -27 -17 -33 -17 -33 -19 -43 -23 -52 -106 callsubr + 20 -4 21 41 27 27 33 14 rlinecurve + 33 14 32 12 34 11 49 12 43 5 36 -1 36 -1 44 19 49 38 rrcurveto + -97 107 rmoveto + -17 -15 -23 -11 -28 -8 -3 -1 -4 2 -74 callsubr + 16 17 6 17 6 13 -14 11 -31 rrcurveto + 0 1 0 1 -3 vhcurveto + endchar + + + -152 217 -273 rmoveto + 7 11 15 28 13 hvcurveto + 1 3 1 1 1 vvcurveto + 16 137 -8 -16 41 291 rlineto + 2 vlineto + 4 -1 2 -3 -2 -1 -1 -1 -3 vhcurveto + -90 -36 -67 -11 -113 -15 -19 -131 rcurveline + 59 15 108 25 58 15 -19 -68 callsubr + -14 -50 callgsubr + vhcurveto + endchar + + + 22 39 176 rmoveto + -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 52 -5 51 4 51 11 51 11 50 12 49 13 -19 -232 rcurveline + -4 -41 89 callgsubr + 40 1 2 1 2 1 2 15 136 rcurveline + -8 -15 42 290 2 10 -4 2 -9 -6 rlinecurve + -69 -28 -110 -30 -94 1 rrcurveto + -50 -51 10 37 -11 hvcurveto + endchar + + + -107 258 -244 rmoveto + 14 137 -7 -16 41 291 1 7 -6 2 -6 -3 rlinecurve + -48 -19 -45 -14 -51 -10 -26 -3 -24 0 -16 4 -26 7 -14 34 5 30 rrcurveto + 3 -2 0 -2 -3 vhcurveto + -42 -57 -33 -107 67 -33 45 -22 110 42 39 10 -19 -232 rcurveline + -7 -83 11 -52 38 81 rrcurveto + endchar + + + 105 470 -217 rmoveto + 15 136 -8 -15 42 290 1 9 -4 2 -8 -5 rlinecurve + -19 -7 -34 -11 -48 -13 -82 -23 -111 -23 -99 8 -43 3 -26 15 -7 27 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 57 -6 66 5 72 16 72 16 65 14 56 15 -19 -232 rcurveline + -4 -41 2 61 callgsubr + 2 1 2 rrcurveto + endchar + + + 35 375 -20 rmoveto + -1 -1 rlineto + -1 vlineto + -4 -51 -4 -41 2 85 callgsubr + 13 12 19 40 rrcurveto + 1 3 1 2 1 vvcurveto + 15 136 -8 -16 8 57 9 56 8 57 rlinecurve + 1 4 3 30 2 20 -6 31 rlinecurve + -8 41 -23 20 -37 -4 -37 -4 -40 -13 -43 -23 -61 -32 -97 -69 -41 -40 -21 -38 -20 -43 -18 -41 rrcurveto + -2 7 -10 3 3 vhcurveto + 11 18 14 16 15 14 38 34 19 19 49 32 40 27 60 33 61 -6 25 -3 18 -15 10 -29 15 -46 -4 -60 -6 -54 rrcurveto + endchar + + + 219 583 -63 rmoveto + 15 136 -8 -15 41 290 2 10 -3 2 -9 -6 rlinecurve + -49 -19 -42 -13 -35 -7 -80 -16 -54 -19 -58 -44 -31 -24 -35 -38 -41 -52 -105 callgsubr + 34 41 35 38 43 31 41 29 39 17 39 6 39 6 44 9 50 13 -19 -232 rcurveline + -4 -41 2 -30 6 -17 6 -17 13 12 19 40 rrcurveto + endchar + + + -1 335 134 rmoveto + 6 -35 -2 -63 -1 -46 -1 -32 -7 -194 -2 -28 -4 -42 89 callgsubr + 41 82 callgsubr + 7 121 rcurveline + 5 115 6 92 9 69 9 69 3 52 -2 34 -2 33 -19 22 -37 10 -37 10 -34 -2 -32 -14 -83 -38 -82 -79 -40 -80 -13 -27 -17 -28 -9 -30 rrcurveto + -11 -4 1 -6 5 hhcurveto + 5 4 2 5 3 hvcurveto + 14 22 12 23 13 23 28 50 62 42 61 15 30 7 28 1 24 -7 24 -7 14 -16 6 -27 rrcurveto + endchar + + + -29 287 210 rmoveto + -54 -3 -48 -31 -43 -59 -43 -59 -33 -52 -23 -45 -17 -29 -15 -34 -11 -33 45 -33 rcurveline + 6 14 6 10 8 18 18 39 28 46 36 56 36 56 44 27 53 -1 32 -1 10 -36 -12 -72 -2 -13 -2 -11 -1 -10 -4 -42 2 -30 6 -17 8 -22 15 27 18 36 14 136 rcurveline + -8 -15 3 18 4 22 4 25 rlinecurve + 8 47 10 64 -45 5 -23 3 -16 0 -9 -1 rrcurveto + endchar + + + -51 16 -1 rmoveto + 6 5 4 10 7 hvcurveto + 1 hlineto + 9 10 64 28 20 hhcurveto + 41 11 80 15 38 10 -18 -68 callsubr + -13 -50 callgsubr + 7 11 14 28 13 vhcurveto + 1 2 0 2 1 2 15 137 rcurveline + -8 -16 42 290 rlineto + 3 vlineto + 4 -1 3 -3 -2 -2 -1 -2 -3 vhcurveto + -101 -40 4 5 -110 -16 -19 -3 -19 -7 -18 -10 -25 -14 -33 -46 36 callgsubr + endchar + + + 216 549 -245 rmoveto + 7 11 14 28 13 hvcurveto + 82 callgsubr + 14 136 rcurveline + -7 -15 41 290 rlineto + 4 vlineto + 3 -1 2 -3 -2 -2 0 -2 -3 vhcurveto + -49 -20 -65 -18 -80 -16 -80 -16 -67 -11 -56 -6 rrcurveto + -1 -13 -12 -1 -11 hhcurveto + -42 -33 8 18 -24 hvcurveto + -12 9 -7 15 20 vvcurveto + 30 14 42 27 53 -95 callgsubr + 2 -1 0 -2 1 vhcurveto + -2 hlineto + -41 callgsubr + -10 -15 -15 -24 -56 callsubr + -15 -34 -11 -36 rrcurveto + -7 -22 -3 -21 -20 vvcurveto + -12 1 -11 3 -11 vhcurveto + -45 10 55 -13 63 hhcurveto + 51 60 8 16 71 hvcurveto + 98 22 81 21 63 16 -19 -68 callsubr + -14 -50 callgsubr + vhcurveto + endchar + + + -35 304 86 rmoveto + -4 -36 -3 -86 -3 -38 -4 -41 1 61 callgsubr + 1 1 2 16 136 rcurveline + -8 -14 14 100 7 41 14 47 -3 48 rlinecurve + -3 33 -19 22 -37 10 -37 10 -34 -2 -32 -14 -43 -20 -34 -27 -27 -34 -36 -47 -28 -51 -28 -55 -2 -4 -26 -56 12 -1 rrcurveto + 43 callsubr + 14 21 12 24 12 23 16 28 22 25 30 20 44 30 66 28 49 -37 20 -15 7 -28 -4 -40 rrcurveto + endchar + + + 377 493 350 rmoveto + -15 -17 -11 -23 -20 hvcurveto + -47 -54 -40 -68 -33 -81 -317 -11 rcurveline + 28 callgsubr + 40 32 -8 23 hhcurveto + 3 3 -1 1 3 hvcurveto + 2 21 29 2 36 hhcurveto + 17 hlineto + 151 81 66 101 66 hvcurveto + 30 46 17 42 4 38 rrcurveto + 1 11 1 10 11 vvcurveto + 17 -2 17 -3 17 -18 callsubr + -29 -32 -15 25 callsubr + hlineto + 7 6 2 10 callgsubr + 17 -19 -78 callgsubr + 13 -69 -80 vvcurveto + -11 0 -11 -1 -11 vhcurveto + -84 callgsubr + 6 12 3 12 13 vvcurveto + 28 -20 56 -31 vhcurveto + -115 -186 rmoveto + 3 1 2 -11 callsubr + -18 -14 -22 -12 -28 -8 rlinecurve + -1 0 -1 0 hvcurveto + -6 -12 14 9 hvcurveto + endchar + + + 137 352 22 rmoveto + -10 41 37 -5 34 hhcurveto + 48 40 10 20 34 hvcurveto + 58 34 48 45 38 59 23 35 14 36 2 34 rrcurveto + 5 vlineto + 32 -18 23 -37 -67 callgsubr + -9 hvcurveto + -18 -9 -17 42 callsubr + -49 -58 -44 -76 -33 -74 -132 -22 -28 2 -149 -6 rrcurveto + 28 callgsubr + 41 31 -8 22 hhcurveto + 4 4 -1 1 3 hvcurveto + 22 4 34 7 45 11 rrcurveto + 27 166 rmoveto + 5 2 6 4 6 vhcurveto + 18 24 16 27 31 31 callgsubr + 37 callgsubr + -2 -5 -4 -4 vhcurveto + -11 -11 -18 -9 29 callsubr + 40 26 43 18 50 24 -10 17 -82 callgsubr + 55 -76 callgsubr + + + -50 178 42 rmoveto + -10 41 38 -5 34 hhcurveto + 47 40 10 20 34 hvcurveto + 58 34 48 45 39 59 23 35 13 36 2 34 rrcurveto + 5 vlineto + 32 -18 23 -36 -67 callgsubr + -10 hvcurveto + -18 -9 -16 42 callsubr + -48 -58 -45 -76 -33 -74 -119 -21 rcurveline + -21 -127 4 1 6 1 4 1 rlinecurve + 192 205 rmoveto + 5 2 6 4 6 -8 callsubr + -23 37 callgsubr + -3 -5 -4 -4 vhcurveto + -11 -11 -17 -9 29 callsubr + 40 26 43 18 50 24 -10 16 -82 callgsubr + 56 -76 callgsubr + + + 128 355 42 rmoveto + 98 -24 79 4 58 34 58 34 48 46 38 59 23 35 14 36 2 34 2 34 -18 25 -39 19 -27 10 -35 17 71 callgsubr + -15 -16 -24 rrcurveto + -16 -24 -8 -12 2 -1 -49 -58 -44 -76 -33 -74 -28 -4 rcurveline + -1 hlineto + -1 -2 -52 -9 -52 -5 -52 1 rlinecurve + -52 1 -31 16 -9 30 -101 callgsubr + 51 -5 64 6 77 14 rrcurveto + 1 hlineto + 205 270 33 callgsubr + -8 -21 -1 -13 7 -19 22 35 callsubr + -46 -39 callgsubr + -61 -18 -35 2 29 40 26 43 18 50 52 -21 -1 4 45 -28 rrcurveto + endchar + + + 21 248 36 rmoveto + 197 -50 106 86 77 117 47 71 14 76 -78 37 -54 20 -95 69 -53 -26 -35 -17 -41 -67 3 -2 -49 -59 -43 -74 -34 -75 -34 -5 -56 -14 -36 9 -27 7 -14 38 8 32 rrcurveto + 1 0 0 -1 -1 vhcurveto + -44 -55 -37 -114 69 -34 47 -23 124 44 39 9 rrcurveto + 99 245 rmoveto + 26 -10 28 -65 -32 -15 -22 -11 -25 -8 -24 -2 -15 8 -14 23 13 18 18 24 15 27 32 11 rrcurveto + 218 -46 rmoveto + 71 -44 -197 -45 -43 1 29 40 26 43 18 50 49 -19 6 -1 41 -25 rrcurveto + endchar + + + 197 424 57 rmoveto + 98 -25 78 4 12 callsubr + 36 13 35 2 34 2 34 -18 26 -39 19 -27 10 -34 16 -40 22 -75 42 -41 -25 -36 -51 -16 -23 -7 -12 2 -1 rrcurveto + -49 -59 -44 -75 -33 -74 -45 -9 -83 -19 -58 -5 -68 -6 -78 3 -15 49 -97 callsubr + 55 -5 61 4 67 14 67 14 61 14 57 14 rrcurveto + 98 244 8 callsubr + -7 -22 -2 -13 7 -18 22 15 20 18 24 14 27 32 11 rrcurveto + 219 -45 rmoveto + 43 -28 -57 -23 -28 -10 -31 -11 -61 -18 -58 callgsubr + 4 45 -27 rrcurveto + endchar + + + 3 230 159 rmoveto + 98 -25 79 5 58 34 58 34 48 46 39 -77 callsubr + -27 10 -35 16 -40 22 -75 42 -40 -25 54 callgsubr + -33 -74 -3 -1 rcurveline + -1 -1 hlineto + -34 -7 -29 -12 -23 -16 -23 -16 -22 -31 -20 -46 -21 -47 -7 -31 -10 -52 rrcurveto + -104 callgsubr + 42 67 52 48 62 27 rrcurveto + 379 214 rmoveto + 43 -28 -58 -23 -27 -10 -31 -11 -61 -17 -58 callgsubr + 3 45 -27 rrcurveto + -218 45 rmoveto + 13 -5 11 -14 -90 callsubr + -26 -12 -24 -7 -21 -2 -13 7 -18 22 15 20 18 25 14 26 32 11 rrcurveto + endchar + + + 234 461 194 rmoveto + 98 -25 79 5 12 callsubr + 36 13 34 2 34 2 34 -18 26 -39 19 -27 10 -35 16 -40 22 -75 41 -40 -24 54 callgsubr + -34 -74 -36 -6 -36 -18 -36 -31 -100 -87 -91 -139 -61 -122 7 callgsubr + 40 85 37 75 35 63 60 107 103 72 139 33 rrcurveto + 99 244 13 callsubr + -2 -16 -16 -7 -26 -12 -24 -6 -21 -2 -13 7 -19 21 35 callsubr + -45 -39 callgsubr + -61 -17 -58 callgsubr + 3 45 -27 rrcurveto + endchar + + + 64 291 157 rmoveto + 98 -25 78 4 58 34 56 callgsubr + 2 34 -18 27 -39 18 13 callgsubr + -75 -33 -75 -64 -10 -45 -19 -29 -29 -29 -29 -25 -36 -20 -43 -7 -13 -6 -12 -7 -13 -2 -4 -24 -53 12 -1 rrcurveto + 43 callsubr + 30 49 38 34 48 19 48 19 52 16 56 13 rrcurveto + 99 244 33 callgsubr + -6 -22 -72 callsubr + 27 32 11 rrcurveto + 218 -46 -39 callgsubr + -62 -17 -35 2 29 40 27 41 18 51 52 -21 -1 4 45 -28 rrcurveto + endchar + + + 33 69 19 rmoveto + 8 6 1 0 8 6 37 25 37 20 37 16 29 13 21 8 13 3 99 -25 78 5 58 34 58 34 49 47 38 -77 callsubr + rrcurveto + -27 10 -35 16 71 callgsubr + -16 -16 -23 -16 -23 -8 -13 2 -1 -49 -59 -42 -75 -34 -74 -65 -30 -71 -18 -40 -51 -16 -22 -17 -35 -14 -36 42 -30 rcurveline + 2 1 3 1 1 1 7 6 7 5 7 5 rrcurveto + 290 342 rmoveto + 13 -6 11 -14 9 -24 9 -24 -4 -15 -16 -7 -25 -12 -23 -8 -22 -1 -12 7 -20 22 15 19 18 24 16 28 31 11 rrcurveto + 218 -46 rmoveto + 44 -27 -57 -24 -28 -10 -31 -11 -62 -17 -35 1 42 callgsubr + + + 40 16 -1 rmoveto + 6 5 5 9 7 hvcurveto + 10 10 19 8 27 9 59 12 61 16 58 13 rrcurveto + -10 41 37 -6 34 hhcurveto + 47 41 10 20 34 hvcurveto + 58 34 48 46 38 59 23 35 14 36 2 34 rrcurveto + 5 vlineto + 32 -18 23 -37 -67 callgsubr + -9 hvcurveto + -18 -9 -17 -16 -16 -23 rrcurveto + -15 -21 -7 -12 -3 vvcurveto + -1 vlineto + -48 -58 -45 -76 -33 -74 -67 -10 rcurveline + -1 -7 -6 -2 -3 hhcurveto + 1 vlineto + -20 -3 -19 -7 -18 -10 -25 -14 -33 -47 36 callgsubr + 279 249 rmoveto + 5 2 5 4 6 vhcurveto + 18 24 16 27 31 11 rrcurveto + 14 -6 23 -31 -29 vvcurveto + -11 -4 -8 -10 -5 vhcurveto + -26 -12 -24 -8 -21 -1 rrcurveto + -9 5 -14 13 15 vvcurveto + 305 12 7 callsubr + -55 -16 -37 hhcurveto + -4 hlineto + 29 39 26 43 18 51 24 -10 17 -82 callgsubr + 55 -76 callgsubr + + + 207 106 334 rmoveto + -2 -1 0 -57 callgsubr + -22 -20 vvcurveto + -56 21 -24 57 -8 vhcurveto + -3 21 21 -1 21 hhcurveto + 38 39 4 9 40 hvcurveto + 63 14 59 14 56 13 rrcurveto + -10 41 38 -5 34 hhcurveto + 47 40 9 20 34 hvcurveto + 56 callgsubr + rrcurveto + 4 vlineto + 32 -18 25 -37 18 vhcurveto + -27 10 -34 16 -40 22 rrcurveto + 14 -26 -23 7 -20 hhcurveto + -11 -11 -1 -5 -9 hvcurveto + -18 -9 -17 -17 -16 -23 rrcurveto + -15 -21 -8 -12 -3 vvcurveto + 1 -1 -49 -58 -44 -76 -33 -74 rlinecurve + -38 -6 -42 -7 -48 -8 rrcurveto + -6 -29 -27 -3 -24 hhcurveto + -57 -40 14 40 -17 hvcurveto + -3 7 -2 8 10 vvcurveto + 28 13 40 25 50 vhcurveto + -88 callsubr + 0 -2 vhcurveto + 359 -114 rmoveto + 6 2 5 4 6 vhcurveto + 18 24 15 27 32 31 callgsubr + -7 -22 -2 rrcurveto + -9 5 -13 12 15 vvcurveto + 305 13 7 callsubr + -56 -15 -37 hhcurveto + -4 hlineto + 29 40 27 42 18 50 24 -10 17 -82 callgsubr + 55 -76 callgsubr + + + 30 257 105 rmoveto + 98 -25 78 6 58 34 58 34 48 46 39 -77 callsubr + 13 callgsubr + -76 -33 -74 -63 -10 -46 -19 -29 -29 -29 -29 -25 -36 -20 -43 rrcurveto + -6 -13 -1 1 0 vvcurveto + -1 vlineto + 18 -32 31 31 35 23 42 14 rlinecurve + 41 14 44 12 46 11 rrcurveto + 98 246 rmoveto + 13 -5 11 -15 -90 callsubr + -25 -12 -24 -7 -22 -1 -53 callgsubr + 14 28 32 11 rrcurveto + 219 -46 rmoveto + 43 -27 -58 -25 -27 -10 -31 -11 -61 -17 -35 2 42 callgsubr + + + -117 155 511 -106 callgsubr + 62 -344 -71 callgsubr + + + -117 -79 callsubr + + + -188 114 142 rmoveto + -2 hlineto + -9 -7 -6 -12 -5 hvcurveto + -91 -237 32 21 46 109 rlineto + -8 22 33 -9 34 hhcurveto + 22 27 2 6 34 hvcurveto + 36 129 rlineto + -4 -29 -26 -2 -21 hhcurveto + -41 -25 7 4 -30 hvcurveto + endchar + + + 32 298 208 rmoveto + -2 vlineto + -87 -37 -85 -14 -104 -22 -22 -133 rcurveline + 100 28 17 5 23 8 29 11 rlinecurve + 47 17 16 7 30 21 -1 -2 -2 -4 -2 -5 -15 -29 -15 -33 -14 -40 rrcurveto + -7 -20 -4 -20 -20 vvcurveto + -21 4 -20 7 -21 vhcurveto + -19 7 14 -23 26 hhcurveto + 45 24 39 29 17 hvcurveto + 18 32 6 45 8 40 rrcurveto + -24 -20 -16 -28 -45 hhcurveto + -27 -16 26 24 5 1 4 1 5 hvcurveto + -51 callgsubr + 8 14 4 15 rrcurveto + 53 53 32 59 90 vvcurveto + 36 -8 37 -9 22 vhcurveto + -11 26 -77 -113 rlineto + 10 -29 21 -56 -34 vvcurveto + endchar + + + 131 307 149 rmoveto + -13 -53 -56 -7 -58 hhcurveto + -58 -34 15 33 -9 hvcurveto + -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 39 -4 45 2 51 6 51 6 44 14 37 20 11 6 11 6 11 8 -1 -2 0 -1 -1 -1 -14 -32 -17 -33 -15 -42 rrcurveto + -14 -40 -1 -41 15 -41 8 -22 15 -49 callgsubr + 33 17 29 17 32 7 45 8 41 -10 -13 -9 -14 -12 -10 -17 -13 -40 -12 -19 20 -27 29 15 48 12 33 rrcurveto + 4 14 8 15 4 15 5 2 4 6 3 4 41 45 25 59 8 67 2 16 -3 22 -7 30 -7 30 -3 13 -3 -4 -77 -113 rcurveline + 14 -40 7 -31 -1 -21 -20 -9 -26 -8 -32 -8 rrcurveto + -1 -2 -1 -1 hhcurveto + endchar + + + 104 367 194 rmoveto + -3 vlineto + -49 -21 -46 -17 -45 -13 rrcurveto + -7 -23 -24 -4 -24 hhcurveto + -23 -25 4 6 -24 hvcurveto + -21 5 -14 26 27 vvcurveto + 5 1 5 1 5 vhcurveto + 2 -1 0 0 -1 0 0 -2 -1 vhcurveto + -21 -28 -16 -36 -9 -44 rrcurveto + -2 -9 -1 -10 -8 vvcurveto + -52 46 -26 55 22 24 4 8 26 vhcurveto + 70 22 45 17 45 32 -17 -34 -16 -34 -16 -45 rrcurveto + -7 -20 -5 -20 -20 vvcurveto + -21 5 -20 7 -21 vhcurveto + -19 7 13 -23 26 hhcurveto + 45 24 39 29 17 hvcurveto + 17 32 8 45 7 41 rrcurveto + -24 -20 -15 -29 -45 hhcurveto + -27 -16 26 24 5 0 4 1 5 hvcurveto + -51 callgsubr + 8 15 4 15 36 31 32 57 9 41 -62 callgsubr + 35 55 callgsubr + -55 -34 vvcurveto + endchar + + + 118 349 305 rmoveto + 10 -28 22 -60 -1 -33 -58 -25 -70 -25 -77 -3 -59 -2 -65 6 -12 43 -97 callsubr + 101 -10 110 26 77 54 -17 -34 -16 -34 -16 -45 rrcurveto + -14 -40 -1 -40 15 -41 8 -22 16 -49 callgsubr + 33 17 29 18 32 6 44 7 41 -7 -10 0 1 -7 -10 -5 -7 -5 -5 -6 -5 -17 -13 -41 -13 -19 20 rrcurveto + -27 29 16 48 12 33 64 callgsubr + 34 32 53 9 42 13 61 -3 62 -19 44 -12 27 rcurveline + endchar + + + 184 443 299 rmoveto + -72 -31 -88 -16 -77 -26 -65 -19 -46 -33 -25 -45 -25 -45 -22 -43 -20 -42 14 1 rcurveline + 64 56 48 33 33 11 33 11 50 15 67 21 42 13 21 5 33 24 -2 -4 -2 -3 -2 -3 -11 -18 -15 -34 -18 -51 86 callgsubr + -23 31 4 rrcurveto + 40 6 21 32 17 29 18 31 6 45 8 41 -10 -13 -9 -13 -12 -10 -17 -14 -40 -13 -19 21 -27 29 15 49 12 33 4 14 8 14 4 15 36 33 32 55 9 42 rrcurveto + 13 61 -3 61 -19 45 -11 27 rcurveline + -76 -114 10 -29 22 -59 -2 -33 rlinecurve + endchar + + + 257 481 448 rmoveto + -102 callsubr + -43 -18 -32 -11 -20 -3 -20 -3 -30 -15 -39 -26 -46 -31 -43 -43 -43 -55 -105 callgsubr + 34 41 35 38 43 31 21 15 24 11 25 7 37 11 36 16 28 22 -17 -34 -16 -35 -16 -45 rrcurveto + 86 callgsubr + 17 callsubr + -10 -13 -9 -13 -12 -10 -17 -14 -41 -13 -19 21 -27 29 17 49 11 33 rrcurveto + 4 14 8 14 4 15 3 2 6 7 11 12 30 36 19 36 8 36 13 61 -3 63 -19 44 -11 27 rcurveline + endchar + + + 80 314 -97 rmoveto + 40 6 21 33 17 29 18 31 6 45 8 41 -10 -13 -9 -14 -12 -10 -17 -14 -41 -12 -19 21 -27 29 17 48 11 33 64 callgsubr + 34 32 52 9 43 rrcurveto + 13 61 -3 63 -19 44 -11 26 rcurveline + -77 -113 10 -29 23 -58 -2 -34 rlinecurve + -31 -14 -32 -9 -31 -7 -31 -7 -30 -9 -27 -12 -49 -21 -33 -30 -16 -36 -16 -36 -21 -48 -27 -59 21 -1 rcurveline + 22 52 34 30 48 23 62 18 76 21 45 35 -2 -5 -2 -3 -1 -2 -15 -29 -14 -34 -14 -40 -14 -40 -1 -40 15 -41 8 -21 15 -25 31 4 rrcurveto + endchar + + + 325 496 304 rmoveto + -38 -16 -60 -18 -46 -11 -71 -15 -87 -23 -60 -31 -72 -36 -31 -42 -31 -82 42 -30 rcurveline + 2 2 3 2 5 3 46 33 33 23 20 11 20 11 19 9 20 6 41 13 62 16 54 20 53 19 23 10 33 29 rrcurveto + -20 4 -18 6 -17 vhcurveto + 8 -22 14 -25 32 5 40 5 21 34 17 29 18 31 6 46 8 41 -19 -25 -12 -21 -38 -7 -27 -5 -16 15 -7 20 41 67 12 61 -17 55 rrcurveto + -26 83 1 0 0 vvcurveto + -77 -114 -102 callsubr + rlinecurve + endchar + + + 70 333 231 rmoveto + -3 1 vlineto + -38 -16 -61 -18 -46 -11 -40 -8 -32 -7 -24 -6 -24 -6 -20 -23 -16 -42 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 20 20 25 12 23 4 24 4 30 7 35 9 20 5 40 17 17 9 9 4 10 6 11 8 -5 -10 rcurveline + -15 -29 -14 -34 -14 -40 rrcurveto + -7 -20 -5 -20 -20 vvcurveto + -40 14 -63 44 45 24 39 29 17 vhcurveto + 18 31 7 45 7 41 rrcurveto + -25 -18 -19 -28 -44 hhcurveto + -27 -15 26 25 4 0 5 1 5 hvcurveto + 4 21 5 18 6 17 4 14 8 15 4 15 35 35 33 52 9 43 -62 callgsubr + 36 -9 22 vhcurveto + -12 26 -76 -113 rlineto + 10 -29 20 -54 -35 vvcurveto + endchar + + + 342 550 21 rmoveto + 4 0 4 1 5 vhcurveto + -51 callgsubr + 9 15 4 15 35 35 32 51 9 43 -62 callgsubr + 36 55 callgsubr + -56 -34 vvcurveto + -2 vlineto + -28 -88 -176 -62 -120 hhcurveto + -48 -37 10 21 -27 hvcurveto + -15 11 -7 17 22 vvcurveto + 28 12 38 23 46 vhcurveto + -20 callsubr + -24 -103 callgsubr + -21 -20 vvcurveto + -56 -98 callsubr + 18 20 0 21 hhcurveto + 130 180 53 42 79 hvcurveto + 9 4 11 7 11 8 -1 -2 -2 -3 -2 -5 -15 -29 -15 -34 -14 -40 rrcurveto + -7 -20 -4 -20 -20 vvcurveto + -21 4 -19 7 -21 vhcurveto + -19 7 13 -24 26 hhcurveto + 45 24 40 29 17 hvcurveto + 18 31 6 45 8 40 rrcurveto + -24 -19 -16 -28 -45 hhcurveto + -27 -16 26 25 hvcurveto + endchar + + + 102 365 270 rmoveto + 1 vlineto + -52 -23 -69 -15 -57 -17 -49 -15 -37 -23 -24 -29 -24 -29 -26 -43 -27 -59 rrcurveto + -1 vlineto + 17 -16 24 37 32 26 39 14 rlinecurve + 39 14 40 13 42 13 42 13 22 6 32 24 -17 -34 -16 -35 -16 -45 -15 -40 0 -40 15 -41 8 -22 16 17 callsubr + rrcurveto + -10 -13 -9 -13 -12 -10 -16 -14 -43 -13 -18 21 -14 15 -4 18 4 21 4 21 4 19 6 17 5 14 8 15 4 15 36 33 32 54 9 42 13 61 -3 62 -19 44 -11 26 rcurveline + -77 -112 10 -29 22 -60 -1 -33 rlinecurve + endchar + + + 67 84 254 rmoveto + 39 46 6 12 25 hvcurveto + 34 16 29 38 30 41 28 39 26 32 -2 19 -5 51 -72 -16 -26 46 28 24 23 8 38 10 8 15 25 30 10 17 rrcurveto + 17 10 12 23 -14 hhcurveto + -14 -35 -20 -11 -15 hvcurveto + -91 -63 -91 -118 26 -45 11 -19 27 -19 35 -8 17 -4 11 -10 -24 -12 -48 -24 -80 -28 -44 -28 rrcurveto + -16 -25 18 -3 30 hhcurveto + endchar + + + 319 -73 callgsubr + 259 -371 -107 callsubr + endchar + + + 105 507 531 -107 callgsubr + -59 -259 -70 callgsubr + + + 204 488 217 rmoveto + -89 -47 -202 -79 -94 74 -89 69 68 72 46 67 48 70 111 66 21 -129 -34 -16 -8 -6 -38 -8 -43 -131 rcurveline + 322 115 -101 533 -312 -487 -49 -77 -70 -115 33 -89 72 -192 329 119 98 150 33 50 31 56 -4 61 -30 387 rcurveline + -73 -122 28 -369 1 -13 1 -5 -6 -4 rlinecurve + endchar + + + 147 309 580 rmoveto + -7 -9 -1 -2 -8 hvcurveto + -49 -9 -64 -66 -78 -121 -25 -38 -24 -46 -24 -52 rrcurveto + -15 -31 -7 -31 -28 vvcurveto + -19 3 -18 7 -18 vhcurveto + -68 25 51 -31 85 hhcurveto + 23 26 3 6 25 hvcurveto + 99 23 108 69 49 73 12 -175 rcurveline + 70 110 -41 620 -74 -122 32 -381 -22 -12 -29 -13 -35 -15 rlinecurve + -25 -60 -78 -25 -79 hhcurveto + -4 hlineto + -36 -29 10 19 -23 hvcurveto + -31 24 -16 24 24 vvcurveto + 11 2 11 6 11 vhcurveto + 19 35 22 34 23 34 24 35 33 26 43 17 rrcurveto + 4 9 8 1 7 hhcurveto + 28 20 -25 -51 8 hvcurveto + -36 -17 -3 -4 -41 -9 -43 -131 rcurveline + 80 29 55 47 30 66 rrcurveto + 21 47 10 40 36 vvcurveto + 56 -24 39 -49 vhcurveto + endchar + + + 561 906 233 rmoveto + -17 callgsubr + 32 35 40 12 -168 rcurveline + 72 110 -17 243 rlineto + 6 0 9 -1 12 vhcurveto + -20 405 -74 -117 5 -85 14 -260 1 -90 rlinecurve + -468 -30 rmoveto + 29 35 5 9 19 hvcurveto + 25 12 22 28 22 31 21 29 20 24 -2 14 -3 39 -54 -12 -20 34 21 18 17 6 29 8 6 11 19 22 7 13 rrcurveto + 13 8 9 17 -11 hhcurveto + -10 -27 -15 -8 -11 hvcurveto + -68 -47 -68 -89 19 -34 8 -14 21 -14 26 -6 13 -3 8 -8 -18 -9 -36 -18 -60 -21 -33 -21 rrcurveto + -12 -19 14 -2 22 hhcurveto + endchar + + + 134 244 182 rmoveto + -32 -16 -37 -11 -41 -8 -41 -8 -37 -6 -34 -5 -22 -128 rcurveline + 70 17 64 19 57 23 57 23 38 54 21 85 rrcurveto + 7 24 5 33 33 vvcurveto + 18 vlineto + -16 256 106 62 106 62 106 62 rlinecurve + 33 117 rlineto + 4 vlineto + 4 -1 1 -3 -2 -2 0 -2 -3 vhcurveto + -19 -11 -241 -141 -63 -37 -32 -117 rcurveline + -61 -95 rlineto + 6 -97 11 -113 -102 vvcurveto + endchar + + + 221 34 callsubr + -62 -19 -165 -42 -23 80 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 78 -8 79 17 78 41 67 37 callsubr + -16 256 rcurveline + 80 46 -1 1 80 46 53 31 54 32 53 31 32 116 rcurveline + -58 callsubr + -108 -63 -107 -71 callsubr + -95 rlineto + 6 -98 -64 callsubr + + + 202 226 450 rmoveto + 109 64 88 47 109 64 33 117 rcurveline + -58 callsubr + -110 -64 -86 -48 -110 -64 -33 -116 rcurveline + -2 -9 4 -3 9 5 rrcurveto + -35 -388 rmoveto + 41 29 35 48 29 64 49 callgsubr + -68 68 -79 -82 -37 -50 -17 -22 -13 -20 -10 -15 3 -45 rcurveline + 34 53 40 14 45 -25 45 -25 21 -39 -3 -54 -52 -24 -58 -14 -65 -6 -62 -122 rcurveline + -5 3 -1 5 vhcurveto + 1 3 3 0 3 hhcurveto + 71 8 61 23 42 30 rrcurveto + endchar + + + -31 35 274 rmoveto + 2 -39 48 71 46 21 43 -30 rlinecurve + 43 -30 20 -41 -3 -54 -52 -24 -58 -14 -65 -6 -62 -122 rcurveline + -5 3 -1 5 vhcurveto + 6 1 6 1 5 1 148 22 68 56 55 122 49 callgsubr + -23 23 -25 10 -25 -5 21 31 19 30 18 31 33 57 43 88 -23 65 -23 64 -67 36 -81 -38 -37 -18 -32 -29 -26 -42 -26 -42 -15 -28 -4 -15 -1 -4 2 -3 5 -4 rrcurveto + 5 -4 6 3 7 11 12 16 25 18 40 19 76 36 56 -23 3 -78 1 -38 -6 -31 -14 -25 -14 -24 -22 -44 -23 -14 -29 -19 -27 -26 -25 -35 -25 -35 -14 -30 -3 -24 rrcurveto + endchar + + + 155 224 49 rmoveto + 102 54 46 110 -7 112 -46 callgsubr + 62 106 62 32 117 rcurveline + 1 6 -6 3 -5 -2 -108 -63 -108 -71 callsubr + -96 rlineto + 7 -100 10 -110 -102 vvcurveto + -39 -17 -226 -90 22 127 rrcurveto + 3 -3 1 -3 -4 vhcurveto + -40 -58 -30 -102 65 -32 48 -23 109 50 30 16 rrcurveto + endchar + + + 306 441 183 rmoveto + -66 -29 -96 -17 -85 -6 -65 -5 -77 3 -13 47 -87 callsubr + -29 27 -15 28 -2 46 -5 54 2 62 8 148 19 106 64 32 130 8 30 6 39 -2 40 -16 256 rcurveline + 80 46 -1 1 80 46 53 31 53 31 53 31 33 117 rcurveline + 1 9 -4 2 -8 -4 -108 -63 -107 -63 -108 -63 -33 -117 rcurveline + -60 -95 rlineto + 6 -98 11 -112 -102 vvcurveto + endchar + + + -35 -18 callgsubr + + + 212 -33 callsubr + -16 257 rcurveline + 106 62 107 63 106 62 32 116 rcurveline + 2 9 -4 3 -9 -5 -108 -63 -107 -71 callsubr + -96 rlineto + 6 -97 -64 callsubr + + + -273 17 hmoveto + 74 100 1 12 0 12 -1 14 rlinecurve + -16 257 80 46 -1 1 80 46 rlinecurve + 53 31 54 31 53 31 32 117 rcurveline + 1 9 -3 2 -8 -4 -107 -63 -110 -63 -107 -63 -32 -117 rcurveline + -60 -96 6 -96 10 -108 1 -99 rlinecurve + endchar + + + 314 50 4 rmoveto + 26 18 25 16 26 16 40 24 38 23 33 33 10 9 6 8 2 4 38 57 27 61 -6 89 -46 callgsubr + 62 105 62 33 117 rcurveline + 2 9 -4 3 -9 -5 -107 -63 -109 -63 -107 -63 -33 -116 rcurveline + -60 -96 rlineto + 7 -96 10 -111 -102 vvcurveto + -2 -11 -6 -21 -11 vhcurveto + -48 -25 -43 -17 -39 -31 -32 -25 -30 -29 -16 -41 46 -33 rcurveline + 0 4 4 1 vvcurveto + endchar + + + 149 284 226 rmoveto + -2 -1 -2 0 -2 -1 -7 -3 -8 -2 -8 -2 -59 -13 -67 -19 -28 38 callsubr + -22 -7 -32 -93 callsubr + 64 64 127 2 60 67 rrcurveto + 0 2 3 7 8 vhcurveto + 1 vlineto + 13 14 10 17 9 19 21 47 15 50 -4 68 -16 256 rcurveline + 106 62 107 63 106 62 32 117 rcurveline + 2 9 -4 2 -9 -5 -107 -62 -109 -65 -107 -62 -32 -116 rcurveline + -60 -96 6 -98 10 -111 1 -103 rlinecurve + endchar + + + 370 507 193 rmoveto + -13 -12 -37 -15 -59 -21 rrcurveto + -22 -64 -60 -14 -65 hhcurveto + -51 -40 14 26 -28 hvcurveto + -13 12 -6 17 22 vvcurveto + 31 13 41 26 51 -95 callgsubr + 1 -1 1 -1 1 vhcurveto + -3 hlineto + -41 callgsubr + -10 -15 -15 -24 -103 callgsubr + -21 -20 vvcurveto + -55 -98 callsubr + 23 24 -2 26 hhcurveto + 83 68 13 25 66 hvcurveto + 92 35 84 64 25 100 rrcurveto + 7 24 5 34 33 vvcurveto + 17 vlineto + -17 257 106 62 107 62 106 62 rlinecurve + 33 117 rlineto + 3 vlineto + 4 -2 1 -3 -2 -1 0 -1 -3 vhcurveto + -108 -64 36 callsubr + rlineto + 6 -98 11 -111 -103 vvcurveto + endchar + + + 147 -18 callgsubr + + + 666 -27 callgsubr + -468 -29 rmoveto + 29 35 5 9 19 hvcurveto + 25 12 22 28 22 31 21 29 20 24 -2 14 -3 39 -54 -12 -20 34 21 18 17 6 29 8 6 11 19 22 7 13 rrcurveto + 13 8 9 17 -11 hhcurveto + -10 -27 -15 -8 -11 hvcurveto + -68 -47 -68 -89 19 -34 8 -14 21 -14 26 -6 13 -3 8 -8 -18 -9 -36 -18 -60 -21 -33 -21 rrcurveto + -12 -19 14 -2 22 hhcurveto + endchar + + + -105 214 501 rmoveto + 32 -324 -32 -17 -75 -16 -117 -16 rlinecurve + -22 -128 55 12 47 11 38 10 rlinecurve + 38 10 37 30 35 52 9 -125 rcurveline + 71 113 -38 461 -83 callgsubr + rlineto + 1 1 2 1 vvcurveto + 3 -1 2 -3 -2 -3 -1 -2 50 callgsubr + endchar + + + 76 396 501 rmoveto + 31 -324 -31 -16 -45 -13 -60 -9 rlinecurve + -60 -9 -49 -5 -35 1 -49 1 -48 9 -11 37 -13 -34 -13 -42 -13 -51 -91 callsubr + 45 -4 57 3 66 11 46 8 38 9 31 12 31 12 31 29 31 45 9 -125 rcurveline + 71 109 -38 465 105 61 85 45 105 62 rlinecurve + 32 117 1 8 -4 2 -8 -4 rlinecurve + 94 callgsubr + -82 rcurveline + endchar + + + -78 241 501 rmoveto + 31 -324 -40 -20 -213 -81 31 132 rlinecurve + 1 0 1 -2 -2 vhcurveto + -43 -56 -35 -111 68 -33 63 -31 136 90 39 57 10 -124 rcurveline + 72 106 -39 468 103 60 88 47 104 61 rlinecurve + 32 117 1 6 -7 3 -5 -2 rlinecurve + -108 -63 -90 -50 -108 -63 -23 -81 rcurveline + endchar + + + 99 419 511 rmoveto + 31 -324 -30 -15 -43 -13 -54 -10 rlinecurve + -54 -10 -43 -6 -32 -2 -65 -5 -77 4 -13 47 -97 callsubr + 65 -7 74 7 80 18 80 18 60 38 39 57 10 -125 rcurveline + 69 138 -36 436 -83 callgsubr + 1 9 -4 4 callsubr + + + -6 327 358 rmoveto + 11 -129 2 -18 19 -211 73 102 rcurveline + -40 472 -83 callgsubr + 2 9 -4 38 callgsubr + -65 -108 5 -54 -50 -17 -58 -27 -67 -39 rlinecurve + -67 -39 -48 -74 -29 -109 23 -5 rcurveline + 71 99 112 81 121 41 rrcurveto + endchar + + + 118 -38 callsubr + 111 -38 462 104 61 85 47 105 61 rlinecurve + 32 116 1 9 -3 4 callsubr + + + -22 328 190 rmoveto + -29 -14 -101 -21 -174 -30 -24 -126 rcurveline + 129 26 76 16 26 7 33 9 33 29 35 49 1 -11 rcurveline + 1 vlineto + 10 -125 73 97 -30 416 105 61 86 46 105 62 rlinecurve + 32 117 1 9 -3 3 -8 -5 rlinecurve + -70 callsubr + -25 -92 rcurveline + -62 -103 1 -9 rlineto + endchar + + + -44 -30 callsubr + 108 -39 466 -15 callsubr + + + -114 50 6 rmoveto + 21 15 26 16 30 19 40 24 38 23 32 33 3 3 4 3 4 5 2 -30 rcurveline + 69 138 -21 366 107 62 106 61 106 63 rlinecurve + 32 117 2 9 -4 2 -8 -5 rlinecurve + -107 -63 -109 -64 -108 -62 -32 -116 rcurveline + -60 -96 17 -308 rlineto + -1 vlineto + -1 -3 -10 -5 -21 -10 -28 -16 -44 -17 -25 -16 -43 -28 -48 -40 -20 -51 46 -34 rcurveline + 1 2 1 -86 callsubr + + + -52 -19 callsubr + 71 106 -38 468 -83 callgsubr + rlineto + 3 vlineto + 4 -1 2 -3 -2 -2 0 -2 -3 vhcurveto + -70 callsubr + -22 -81 rcurveline + -65 -108 19 -213 -86 -19 -57 -13 -28 -9 rlinecurve + -14 -5 -15 -9 -14 -11 -21 -17 -27 -39 -15 -34 rrcurveto + -1 vlineto + -10 -12 -5 -10 -9 vvcurveto + -10 8 -14 9 vhcurveto + endchar + + + 210 -11 callgsubr + 109 -37 465 295 168 32 117 rlineto + 1 1 1 1 vvcurveto + 4 -2 1 -3 -2 -2 -1 -1 50 callgsubr + -64 -108 23 -252 -28 callsubr + + + -44 -30 callsubr + 105 -39 469 -15 callsubr + + + 204 387 782 -107 callsubr + 101 -565 rmoveto + -89 -47 -202 -79 -94 74 -89 69 68 72 46 67 48 70 111 66 21 -129 -34 -16 -8 -6 -38 -8 -43 -131 rcurveline + 322 115 -101 533 -312 -487 -49 -77 -70 -115 33 -89 72 -192 329 119 98 150 33 50 31 56 -4 61 -30 387 rcurveline + -73 -122 28 -369 1 -13 1 -5 -6 -4 rlinecurve + endchar + + + endchar + + + 79 76 -6 callsubr + + + -24 callsubr + + + 580 487 148 -82 callsubr + + + 147 581 138 rmoveto + -11 158 -10 162 -10 158 106 62 107 62 -7 callsubr + -116 rcurveline + -60 -96 7 -100 6 -96 6 -102 rlinecurve + -52 -33 -386 -170 6 230 1 53 27 42 20 36 -11 -3 -7 -5 -5 -8 -129 -198 39 -86 52 -46 114 -101 257 119 80 118 11 -174 rcurveline + endchar + + + 562 905 292 rmoveto + -20 1 -21 -18 vvcurveto + -17 callgsubr + 31 35 40 11 -167 rcurveline + 73 110 -17 241 rlineto + 10 0 10 -1 8 vhcurveto + -15 257 106 62 106 62 106 62 rlinecurve + 33 116 -58 callsubr + rlinecurve + -108 -63 36 callsubr + 5 -82 8 -86 3 -84 rlinecurve + endchar + + + 1019 905 290 rmoveto + -20 1 -19 -19 vvcurveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -69 callgsubr + -99 callsubr + 47 -6 58 -1 71 3 156 6 142 43 101 68 56 38 35 51 16 63 rrcurveto + 7 25 4 26 1 27 rrcurveto + 10 0 10 -1 9 vhcurveto + -15 256 106 62 106 63 106 62 rlinecurve + 33 117 1 8 -4 2 -8 -4 rlinecurve + -108 -64 -107 -62 49 callsubr + 5 -81 8 -89 3 -83 rlinecurve + endchar + + + 580 773 927 -107 callsubr + -286 -779 -82 callsubr + + + 319 387 752 -107 callsubr + 261 -938 rmoveto + 4 4 -12 -3 -5 -1 -175 -46 -260 -39 -136 153 -78 88 247 211 55 48 40 35 43 36 32 46 27 38 64 138 -66 27 -64 27 -108 -20 -44 -31 -66 -47 -39 -153 75 -83 rrcurveto + -90 -82 -118 -209 30 -141 55 -261 426 67 163 198 rrcurveto + -446 594 rmoveto + 29 25 136 24 20 -59 -34 -32 -52 -32 -41 -30 -16 36 -27 30 -15 38 rrcurveto + endchar + + + 81 -9 callgsubr + + + 64 -9 callgsubr + + + 666 -28 callgsubr + + + -31 243 182 rmoveto + -30 -13 -30 -10 -29 -7 -29 -7 -44 -7 -58 -9 -22 -125 rcurveline + -1 -4 94 23 59 18 23 12 rlinecurve + 68 37 callsubr + -18 333 rcurveline + -74 -118 8 -146 9 -83 1 -133 rlinecurve + endchar + + + 90 34 callsubr + -63 -19 -165 -40 -22 78 -13 -35 -13 -43 -13 -50 1 -29 27 -15 28 -2 78 -8 79 17 78 41 67 35 42 57 19 76 9 35 5 36 -2 37 -19 338 rcurveline + -74 -118 rlineto + 6 -92 12 -178 -97 vvcurveto + endchar + + + 310 627 600 rmoveto + -18 -42 -21 -38 -19 -41 10 -56 9 -61 8 -58 rrcurveto + -4 -5 -6 -9 -8 vhcurveto + -29 -25 -33 -22 -35 -19 -43 -23 -43 -18 -45 -22 -215 -94 rcurveline + -43 -17 -50 -17 -41 -19 rrcurveto + -3 -3 -2 -44 callgsubr + -1 7 vhcurveto + 13 15 2 6 hhcurveto + 117 2 119 5 86 33 157 59 129 142 6 202 -7 55 -12 50 -12 50 rrcurveto + endchar + + + -13 321 205 rmoveto + 8 28 5 38 -2 42 -17 348 rcurveline + -74 -118 rlineto + 7 -100 10 -175 -102 vvcurveto + -45 -19 -76 -27 -53 13 rrcurveto + -23 6 -12 26 27 vvcurveto + -1 5 -5 3 -6 -8 -38 -59 -24 -95 63 -31 45 -22 72 33 36 19 66 35 45 55 19 78 rrcurveto + endchar + + + 198 521 230 rmoveto + 10 35 4 37 -2 39 -22 323 rcurveline + -75 -121 4 -68 4 22 4 -83 rlinecurve + 3 -70 5 -88 -66 vvcurveto + -67 -29 -102 -20 -87 -6 -67 -5 -78 4 -14 48 -14 -36 -14 -44 -13 -52 1 -30 28 -14 29 -3 47 -5 55 2 64 8 153 20 110 67 34 135 rrcurveto + endchar + + + -188 -25 callsubr + + + 79 -33 callsubr + -15 288 rcurveline + -25 -41 -26 -41 -25 -41 rrcurveto + 6 -97 -64 callsubr + + + 7 280 188 rmoveto + -30 -13 -29 -9 -29 -7 -29 -7 -61 -11 -92 -16 -10 -125 rcurveline + 119 28 72 20 23 12 68 36 42 56 19 76 8 29 5 39 -2 39 -12 212 rcurveline + -73 -108 5 -79 5 -90 1 -82 rlinecurve + endchar + + + -230 21 hmoveto + 75 100 1 17 0 12 -1 9 rlinecurve + -21 337 -75 -121 rlineto + endchar + + + 314 267 232 rmoveto + 0 0 0 -44 -22 vhcurveto + -29 -15 -25 -12 -18 -9 -28 -13 -30 -19 -30 -26 -31 -27 -21 -28 -11 -29 45 -33 rcurveline + 1 1 3 3 1 1 18 12 23 15 29 19 47 28 61 32 35 37 11 12 7 7 1 3 16 24 25 44 7 32 10 35 4 36 -2 37 -21 405 rcurveline + -74 -117 rlineto + 6 -84 14 -258 -91 vvcurveto + endchar + + + 14 285 227 rmoveto + -8 -4 -9 -3 -9 -2 -58 -14 -71 -19 -29 -10 -28 -10 -21 -17 -14 -23 -9 -16 -8 -22 -7 -32 -93 callsubr + 18 18 26 15 29 13 37 16 40 10 36 16 67 30 43 61 18 73 8 29 5 41 -2 39 -18 281 rcurveline + -73 -116 6 -98 10 -111 1 -103 rlinecurve + endchar + + + 248 507 199 rmoveto + -13 -12 -37 -16 -59 -21 -96 -34 -141 -28 -71 66 -31 29 7 58 44 88 4 7 -9 1 -3 -4 -10 -15 -15 -23 -56 callsubr + -15 -34 -11 -36 -11 -36 -2 -33 7 -29 rrcurveto + 7 -29 24 -19 43 -6 102 -15 109 19 79 30 92 35 84 63 25 100 9 35 5 37 -2 37 -21 350 rcurveline + -74 -121 rlineto + 6 -90 14 -190 -96 vvcurveto + endchar + + + -181 -25 callsubr + + + 666 -28 callgsubr + + + -118 211 482 rmoveto + 22 -305 -32 -17 -71 -16 -108 -15 rlinecurve + -22 -129 56 14 44 11 34 9 rlinecurve + 34 9 34 30 35 52 10 -125 rcurveline + 72 106 -34 498 rlineto + endchar + + + 77 403 486 rmoveto + 25 -309 -32 -16 -45 -13 -60 -9 rlinecurve + -60 -9 -49 -5 -35 1 -49 1 -48 9 -11 37 -13 -35 -13 -42 -13 -50 1 -30 28 -13 27 -3 65 -7 69 4 73 16 73 16 56 37 40 59 10 -125 rcurveline + 71 104 -36 505 rlineto + endchar + + + 368 764 565 rmoveto + -3 -2 0 -1 -2 hvcurveto + -33 -17 -30 -35 -16 -33 -28 -57 -24 -48 -20 -41 -20 -41 -36 -36 -54 -30 -37 -21 -42 -20 -41 -18 -22 -10 rcurveline + -215 -94 -43 -17 -50 -17 -41 -19 rlinecurve + -3 -3 -2 -44 callgsubr + -1 7 vhcurveto + 13 15 2 6 hhcurveto + 117 2 119 5 86 33 78 30 66 47 51 62 32 40 23 39 14 41 14 41 20 41 28 44 rrcurveto + 6 4 3 4 3 hhcurveto + 6 3 -9 -3 hvcurveto + 21 -425 62 93 -15 464 rlineto + 6 -7 2 -8 vhcurveto + endchar + + + -79 250 484 rmoveto + 22 -307 -40 -20 -94 -27 -53 13 rlinecurve + -27 7 -15 37 8 32 rrcurveto + 1 0 0 -1 -1 vhcurveto + -44 -55 -37 -114 69 -34 77 -38 124 92 37 55 10 -125 rcurveline + 71 104 -33 502 rlineto + endchar + + + 98 418 576 rmoveto + 31 -389 -3 -2 -4 -2 -4 -1 rlinecurve + -1 vlineto + -32 -14 -42 -11 -50 -9 -50 -9 -40 -5 -30 -2 -65 -5 -77 4 -13 47 -97 callsubr + 62 -6 71 5 76 16 76 16 59 34 42 51 rrcurveto + 5 5 5 7 2 3 9 -125 rcurveline + 69 138 -40 551 rlineto + endchar + + + -9 327 358 rmoveto + 28 -358 72 107 -43 581 -73 -122 9 -118 -50 -18 -59 -27 -67 -39 rlinecurve + -67 -39 -48 -74 -29 -109 23 -5 rcurveline + 71 99 111 81 122 41 rrcurveto + endchar + + + 118 -38 callsubr + 109 -41 516 rlineto + endchar + + + -59 377 109 rmoveto + -31 455 -73 -123 rlineto + -8 vlineto + 19 -249 -32 -17 -90 -18 -148 -20 rlinecurve + -22 -129 95 18 64 14 34 9 rlinecurve + 34 9 34 29 35 52 10 -131 rcurveline + endchar + + + -44 271 580 rmoveto + 9 -131 -3 callgsubr + 73 101 -50 600 rlineto + endchar + + + -82 51 6 rmoveto + 18 12 23 15 29 19 55 32 67 35 36 48 4 -50 rcurveline + 69 138 -31 529 -73 -117 27 -432 rlineto + 0 0 0 -48 -23 vhcurveto + -71 -34 -37 -13 -56 -48 -31 -27 -21 -28 -11 -28 46 -34 rcurveline + 1 1 3 4 1 1 rrcurveto + endchar + + + -52 -19 callsubr + 72 108 -43 516 -74 -123 19 -213 -86 -19 -57 -13 -28 -9 rlinecurve + -14 -5 -15 -9 -14 -11 -21 -17 -27 -39 -15 -34 77 callgsubr + 8 -14 9 vhcurveto + endchar + + + 210 -11 callgsubr + 106 -38 536 -74 -122 21 -271 -28 callsubr + + + -44 275 537 rmoveto + 5 -88 -4 callgsubr + 103 -45 554 rlineto + endchar + + + 81 260 838 -104 callsubr + 68 -172 rmoveto + 28 -443 -64 -54 -95 -40 -111 20 rlinecurve + -107 46 88 134 31 69 9 24 -12 3 20 callsubr + -28 146 211 rrcurveto + 49 71 30 84 85 vvcurveto + 0 -21 340 -5 78 vhcurveto + endchar + + + 172 54 -6 callgsubr + endchar + + + 141 -35 callsubr + + + -14 -35 callsubr + + + 41 -10 callgsubr + + + 198 487 176 rmoveto + 19 29 16 43 12 58 3 16 -2 15 -16 -74 callgsubr + 10 41 callsubr + -9 -21 -10 -20 -8 -15 0 -15 8 -13 -68 -20 -105 -32 -90 16 rrcurveto + -28 5 -17 15 -7 23 -97 callsubr + 55 -6 58 6 62 17 102 27 106 59 48 71 rrcurveto + endchar + + + 105 446 279 rmoveto + 3 14 -95 48 -20 -26 -69 -91 rcurveline + -13 -16 -16 -32 19 -19 -44 -13 -78 -22 -49 12 -24 6 -12 29 2 29 rrcurveto + 4 -6 1 -3 -5 vhcurveto + -40 -58 -28 -101 65 -32 24 -12 33 4 25 6 142 31 153 106 31 137 rrcurveto + endchar + + + 294 484 99 rmoveto + 44 29 31 29 20 29 20 29 15 42 12 58 3 17 -2 15 -16 2 -34 4 -48 9 -22 -20 -7 -7 -5 -4 -1 -3 -44 -98 rcurveline + -8 -16 -7 -17 11 -18 -76 -21 -104 -25 -91 -3 -59 -3 -65 6 -12 43 -66 callgsubr + 60 -6 72 6 85 17 85 17 71 27 55 36 rrcurveto + endchar + + + 150 -37 callsubr + + + 230 195 26 rmoveto + 37 45 39 33 38 20 76 40 68 31 53 62 26 31 20 49 13 66 3 17 -1 14 -17 -75 callsubr + -9 -9 -5 -5 -1 -3 -15 -34 -15 -35 -16 -34 rrcurveto + -8 -16 0 -15 8 -13 -98 -29 -69 50 callsubr + 5 30 rcurveline + 1 vlineto + -54 -65 rlineto + -1 vlineto + -3 -38 -3 -41 2 85 callgsubr + 12 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 rrcurveto + endchar + + + 79 241 257 rmoveto + -5 -4 -1 -2 -2 hvcurveto + -63 -15 -51 -24 -33 -42 -30 -39 -29 -78 -24 -54 21 -2 rcurveline + 9 22 12 20 17 18 42 43 64 21 61 23 68 26 53 42 34 62 17 33 14 39 9 45 3 17 -1 14 -17 -74 callgsubr + 9 -22 -20 -31 -29 -16 -48 -14 -43 rrcurveto + -7 -19 1 -14 6 -10 rrcurveto + endchar + + + 314 52 5 rmoveto + 52 37 53 33 52 29 47 26 43 23 40 35 57 48 27 50 18 91 4 16 -2 15 -17 -75 callsubr + -16 -16 -11 -19 -7 -22 -7 -22 -9 -21 -11 -20 rrcurveto + -8 -16 0 -15 8 -13 -4 -2 -4 -1 -4 -2 -42 -17 -41 -16 -38 -18 -29 -15 -23 -16 -18 -20 -20 -23 -25 -40 -13 -42 42 -29 rcurveline + 6 4 3 1 1 1 rrcurveto + endchar + + + 84 283 128 rmoveto + 40 20 30 23 20 24 37 45 7 11 15 73 5 25 -13 14 -31 1 -31 1 -22 -2 -12 -4 rrcurveto + -18 -16 -18 -37 -17 hvcurveto + -17 -37 -12 -29 -9 -19 -31 -11 -27 -8 -21 -6 -30 -9 -67 -23 -17 -27 -15 -24 -4 -29 -13 -27 -93 callsubr + 1 1 rcurveline + 60 55 111 20 77 39 rrcurveto + endchar + + + 357 271 13 rmoveto + 140 23 143 48 82 76 50 45 17 46 17 82 3 17 -2 14 -16 -75 callsubr + -7 -7 -5 -5 -1 -2 -44 -99 rcurveline + -8 -16 -6 -18 10 -17 -58 -16 -59 -17 -61 -12 -88 -18 -143 -22 -39 70 -19 32 7 49 33 65 -62 callsubr + -4 -25 -35 -37 -65 -19 -48 -15 -41 -17 -56 21 -42 rrcurveto + 12 -23 23 -14 34 -5 50 -7 63 4 76 13 rrcurveto + endchar + + + 60 223 227 rmoveto + -2 -1 -6 -2 -3 -1 -73 -18 -48 -25 -22 -33 -22 -33 -23 -44 -24 -57 18 -13 rcurveline + 1 hlineto + 23 36 30 26 37 14 37 14 39 16 38 17 38 17 36 25 33 34 33 34 25 54 15 76 3 17 -1 14 -17 2 -18 2 -19 2 -20 2 -32 3 -24 -16 -8 -20 rrcurveto + -15 -33 -14 -34 -15 -32 -8 -16 0 -14 8 -13 rrcurveto + endchar + + + 41 -10 callgsubr + + + 36 239 21 rmoveto + 89 26 92 36 46 56 37 46 7 9 15 74 5 25 -13 14 -31 1 -31 1 -22 -102 callgsubr + -16 -19 -37 -17 hvcurveto + -17 -37 -12 -28 -9 -19 -31 -9 rcurveline + -67 -18 -172 -41 -23 80 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 59 -5 61 6 63 18 rrcurveto + endchar + + + -4 35 9 rmoveto + 53 -29 150 43 95 48 40 20 40 26 27 34 28 34 9 33 10 49 5 25 -13 13 -31 1 -31 1 -9 0 -25 -4 -14 -2 -5 -5 -10 -14 -24 -33 -18 -48 -18 -39 rrcurveto + -58 -29 -103 -14 -46 14 -23 7 -13 30 4 30 1 8 -3 0 -6 -8 -8 -10 -88 -135 84 -46 rrcurveto + endchar + + + 131 178 4 rmoveto + 102 10 106 30 78 38 44 21 33 23 21 26 37 46 6 11 15 74 5 25 -13 14 -31 1 -31 1 -21 -2 -12 -4 rrcurveto + -18 -17 -18 -38 -16 hvcurveto + -16 -38 -13 -28 -9 -19 -74 -21 -89 -24 -90 -2 -59 -3 -65 6 -12 43 -66 callgsubr + 36 -3 40 1 46 4 rrcurveto + endchar + + + -6 -37 callsubr + + + 67 348 142 rmoveto + 1 vlineto + 61 24 56 30 32 38 37 46 7 10 15 74 5 25 -13 13 -31 1 -31 1 -22 -102 callgsubr + -17 -18 -37 -16 hvcurveto + -16 -37 -13 -29 -9 -19 -27 -8 -31 -17 -21 -14 -116 -76 -50 -138 -64 -128 4 30 rcurveline + -89 callgsubr + 59 71 20 13 76 32 rrcurveto + endchar + + + -35 188 121 rmoveto + 75 25 91 37 41 50 37 45 7 12 0 callsubr + -37 -17 hvcurveto + -17 -37 -12 -29 -9 -19 -38 -11 -16 -6 -37 -13 -36 -13 -29 -21 -22 -29 -16 -20 -13 -23 -12 -26 87 callgsubr + 9 21 13 18 18 18 32 31 42 18 53 15 rrcurveto + endchar + + + -52 52 7 rmoveto + 52 36 52 33 53 29 47 25 43 25 40 35 57 47 28 50 18 91 4 17 -2 15 -17 -74 callgsubr + 9 41 callsubr + -8 -20 -11 -20 rrcurveto + -8 -16 0 -14 8 -13 -44 -21 -48 -15 -42 -20 -29 -15 -22 -17 -18 -19 -21 -23 -24 -39 -14 -43 42 -30 rcurveline + 1 hlineto + 4 3 3 -86 callsubr + + + -69 420 342 rmoveto + 5 25 -13 14 -31 1 -31 1 -21 -102 callgsubr + -18 -24 -48 -17 hvcurveto + -17 -48 -13 -33 -9 -20 -37 -13 -42 -12 -33 -15 -39 -18 -32 -48 -19 -44 22 callsubr + 12 17 21 20 27 16 33 11 32 7 32 9 30 12 105 41 72 92 24 121 rrcurveto + endchar + + + 216 79 3 rmoveto + 96 -12 148 27 87 26 86 23 104 41 46 56 37 46 7 9 15 74 5 25 -13 14 -31 1 -31 1 -22 -102 callgsubr + -17 -19 -37 -16 hvcurveto + -16 -37 -13 -28 -9 -19 -44 -13 -50 -13 -46 -9 -49 -11 -45 -6 -40 -2 -66 -4 -61 9 -23 41 -19 32 8 49 33 65 -62 callsubr + -4 -25 -35 -37 -65 -19 -48 rrcurveto + -15 -41 -17 -56 21 -42 12 -23 23 -14 34 -5 rrcurveto + endchar + + + -95 237 131 rmoveto + 45 22 32 25 20 24 37 45 8 13 0 callsubr + -38 -17 hvcurveto + -17 -38 -12 -29 -9 -19 -8 -2 -11 -5 -15 -7 -22 -10 -34 -17 -17 -14 -46 -38 -22 -60 -26 -60 18 -13 rcurveline + 1 hlineto + 13 21 19 19 23 16 46 31 65 18 52 26 rrcurveto + endchar + + + -47 293 134 rmoveto + -3 5 -34 111 3 112 -5 144 rlinecurve + -1 32 -16 27 -26 14 -26 14 -29 -15 -14 -15 -39 -42 -136 -221 91 -41 54 -25 54 37 24 35 1 -125 16 -83 29 -100 rrcurveto + -142 395 rmoveto + -6 5 -2 8 4 7 11 21 11 26 33 -5 19 -3 14 -25 5 -16 rrcurveto + -2 7 -12 -1 -2 hvcurveto + -23 -16 -46 -7 -23 18 rrcurveto + endchar + + + -99 225 94 -34 callsubr + + + -99 225 363 -34 callsubr + + + 99 -48 callsubr + + + 64 -48 callsubr + + + 173 550 226 rmoveto + 47 123 -54 -6 -18 14 -16 30 -27 -5 rlinecurve + -52 -10 -26 -44 -27 -37 -41 -56 -34 -63 -56 -42 -31 -2 -12 23 -7 21 -25 77 41 197 -133 -150 -46 -52 -24 -72 -9 -88 16 30 13 32 20 26 69 89 20 -52 9 -79 rrcurveto + 6 -47 3 -48 29 -25 15 -13 22 -3 15 15 46 45 28 62 35 55 97 153 -6 -112 58 2 rrcurveto + endchar + + + 173 461 225 rmoveto + 8 -12 13 19 20 50 20 50 5 30 -10 10 -30 29 -49 -33 -18 -21 -15 -18 -14 -18 -13 -19 -41 -56 -36 -63 -55 -42 -16 -1 -11 5 -7 9 -19 25 -6 31 -1 46 rrcurveto + -1 42 -1 62 -34 2 -14 1 -23 -19 -33 -37 -44 -49 -27 -71 -9 -92 8 15 8 16 7 15 18 37 58 74 22 -27 13 -16 9 -28 5 -40 5 -47 4 -49 29 -24 rrcurveto + 18 -16 17 0 16 15 23 22 20 26 16 29 24 44 52 91 31 21 28 19 16 -15 14 -22 rrcurveto + endchar + + + 99 371 650 -107 callgsubr + -22 -525 -90 callgsubr + + + 99 349 125 -90 callgsubr + + + 99 349 125 -90 callgsubr + + + 514 -13 callgsubr + 102 -12 106 27 78 31 88 35 92 59 39 80 rrcurveto + 30 62 7 56 -16 49 rrcurveto + -24 74 0 0 0 vvcurveto + -77 -113 10 -28 23 -61 -2 -33 rlinecurve + 0 0 1 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -8 rrcurveto + endchar + + + 3 -72 rmoveto + 9 -1 9 3 9 6 26 16 12 26 14 32 3 7 -2 5 -5 -7 -7 -8 -8 -6 -9 -3 -9 -4 -11 0 -9 1 rrcurveto + -9 -9 3 7 -8 hvcurveto + -8 5 -6 7 -4 10 -4 9 0 12 3 13 3 12 8 14 12 17 rrcurveto + 3 vlineto + 1 -1 0 -1 -3 -4 -3 -8 -6 vhcurveto + -15 -21 -9 -22 -10 -32 -4 -16 -1 -14 1 -12 2 -33 17 -16 34 -3 rrcurveto + endchar + + + 127 414 623 -104 callsubr + -184 -615 -97 callgsubr + + + -176 108 14 rmoveto + 33 69 26 89 -11 109 rrcurveto + 4 -2 12 4 vvcurveto + -13 108 -30 91 -34 85 -19 -46 -18 -50 -15 -44 54 -117 34 -155 -21 -173 8 -3 5 11 3 6 rrcurveto + endchar + + + -99 144 10 rmoveto + 23 48 18 62 -8 77 rrcurveto + 3 -1 8 3 vvcurveto + -9 75 -21 64 -24 60 -13 -33 -13 -35 -10 -30 37 -82 24 -109 -15 -121 6 -2 4 8 2 4 rrcurveto + endchar + + + -99 144 279 rmoveto + 23 48 18 62 -8 77 rrcurveto + 3 -1 8 3 vvcurveto + -9 75 -21 64 -24 60 -13 -33 -13 -35 -10 -30 37 -82 24 -109 -15 -121 6 -2 4 8 2 4 rrcurveto + endchar + + + 104 41 rmoveto + 6 17 2 14 10 vvcurveto + 5 vlineto + 15 -2 -4 10 -14 hhcurveto + -23 -28 -33 -23 -22 20 -10 15 -8 hvcurveto + 14 callsubr + -3 -2 -1 vvcurveto + 18 2 16 6 14 5 41 14 26 20 24 32 5 -3 5 -1 4 -5 rrcurveto + 6 9 4 7 11 vvcurveto + 1 vlineto + -1 6 -4 4 -4 3 rrcurveto + -85 hmoveto + 6 17 2 14 10 vvcurveto + 17 -6 13 -14 -24 -28 -33 -23 -22 20 -10 15 -8 vhcurveto + 14 callsubr + -2 -2 -1 vvcurveto + 6 1 60 17 40 17 32 44 rlinecurve + 6 -3 3 -1 5 -5 rrcurveto + 5 9 6 7 11 vvcurveto + 1 vlineto + -1 6 -4 4 -4 3 rrcurveto + 59 41 rmoveto + 1 hlineto + 8 5 -8 -10 -4 -1 -5 -1 -7 hvcurveto + -9 5 -10 4 -7 7 rrcurveto + -1 2 0 1 2 vvcurveto + 7 9 5 6 1 vhcurveto + -86 hmoveto + 2 hlineto + 9 4 -9 -10 -4 -1 -5 -1 -6 hvcurveto + -8 4 -19 7 11 vvcurveto + 7 8 4 6 1 vhcurveto + endchar + + + 121 244 33 rmoveto + -16 -15 5 9 -15 hvcurveto + 9 -15 -10 5 -6 hhcurveto + -7 -7 -1 -4 -4 hvcurveto + 5 -9 rlineto + 1 2 2 1 2 hhcurveto + 13 8 -13 -11 7 hvcurveto + -27 17 24 -24 25 hhcurveto + 23 16 11 23 9 hvcurveto + 2 -1 rlineto + -7 -15 -3 -16 -16 vvcurveto + -26 17 -30 34 -34 vhcurveto + 7 -7 10 -9 12 -11 27 -25 rcurveline + 12 -11 8 -10 4 -8 rrcurveto + -12 -3 -6 -6 -10 vvcurveto + -12 7 -7 13 13 6 7 13 9 -6 12 -11 17 vhcurveto + -17 23 -11 19 -7 13 rrcurveto + -30 56 -16 67 77 vvcurveto + 76 -23 44 -47 11 vhcurveto + 1 vlineto + 47 11 23 44 76 vvcurveto + 77 16 68 30 56 vhcurveto + 7 13 11 19 17 23 rrcurveto + 11 17 6 12 9 vvcurveto + 13 -6 6 -13 -13 -7 -6 -12 -10 6 -6 12 -3 vhcurveto + -4 -8 -8 -10 -12 -11 -27 -26 rcurveline + -12 -11 -10 -9 -7 -7 rrcurveto + -34 -34 -17 -30 -26 vvcurveto + -16 3 -15 7 -15 vhcurveto + -2 -2 rlineto + 23 -9 -16 12 -23 hhcurveto + -20 -19 -13 -25 -18 hvcurveto + -11 -9 -10 -26 -18 hhcurveto + -2 -2 0 1 -2 hvcurveto + -5 -8 rlineto + -4 4 7 -1 7 hhcurveto + 6 10 5 9 15 hvcurveto + 9 15 15 5 16 hhcurveto + 45 33 -30 -45 -26 -10 -23 -21 -19 hvcurveto + -4 2 rlineto + 3 4 2 5 6 vvcurveto + 16 -11 11 -21 6 vhcurveto + -26 7 -14 16 22 vvcurveto + 8 2 8 3 9 vhcurveto + -8 4 rlineto + -30 -28 -15 -30 -34 vvcurveto + 9 -9 -10 5 -12 hhcurveto + -32 -20 -22 -25 -21 hvcurveto + -10 -11 -9 -8 -10 -5 4 -10 rcurveline + 2 3 6 1 7 hhcurveto + 6 6 -4 -7 6 hvcurveto + 13 -14 6 -7 0 vvcurveto + -13 14 15 -7 16 hhcurveto + 14 10 4 8 7 hvcurveto + -34 15 -31 30 -28 vhcurveto + 8 4 rlineto + -3 9 -2 9 8 vvcurveto + 22 14 15 26 7 vhcurveto + 21 6 11 12 16 vvcurveto + 6 -2 5 -3 4 vhcurveto + 4 1 rlineto + 21 -19 10 -22 -26 vvcurveto + -45 -33 -30 -45 vhcurveto + -29 164 rmoveto + -2 vlineto + -15 -8 -10 -10 -6 -12 rrcurveto + -24 5 -12 10 16 vvcurveto + 16 12 10 24 5 vhcurveto + 6 -12 10 -10 15 -8 rrcurveto + endchar + + + 121 241 359 rmoveto + 16 16 -5 -9 15 hvcurveto + -9 15 10 -5 6 hhcurveto + 7 6 1 4 4 hvcurveto + -4 8 rlineto + -1 -2 -2 0 -2 hhcurveto + -13 -9 13 11 -7 hvcurveto + 27 -17 -24 24 -25 hhcurveto + -23 -16 -12 -23 -9 hvcurveto + -2 2 rlineto + 7 15 3 15 16 vvcurveto + 26 -17 30 -34 34 vhcurveto + -7 7 -9 9 -12 11 -28 26 rcurveline + -12 11 -7 10 -4 8 rrcurveto + 12 3 5 6 10 vvcurveto + 12 -6 6 -13 -13 -7 -6 -13 -9 6 -12 11 -17 vhcurveto + 17 -23 12 -19 7 -13 rrcurveto + 30 -56 15 -68 -77 vvcurveto + -76 24 -44 47 -11 vhcurveto + -1 vlineto + -47 -11 -24 -44 -76 vvcurveto + -77 -15 -67 -30 -56 vhcurveto + -7 -13 -12 -19 -17 -23 rrcurveto + -11 -17 -6 -12 -9 vvcurveto + -13 7 -7 13 13 6 7 12 10 -5 6 -12 3 vhcurveto + 4 8 7 10 12 11 28 25 rcurveline + 12 11 9 9 7 7 rrcurveto + 34 34 17 30 26 vvcurveto + 16 -3 16 -7 15 vhcurveto + 2 1 rlineto + -23 9 16 -11 23 hhcurveto + 20 19 12 25 18 hvcurveto + 11 9 11 27 18 hhcurveto + 2 2 -1 -1 2 hvcurveto + 4 9 rlineto + 4 -4 -6 1 -7 hhcurveto + -6 -10 -5 -9 -15 hvcurveto + -9 -15 -16 -5 -16 hhcurveto + -45 -32 30 45 26 10 22 21 19 hvcurveto + 4 -1 rlineto + -3 -4 -2 -5 -6 vvcurveto + -16 11 -12 21 -6 vhcurveto + 26 -7 13 -15 -22 vvcurveto + -8 -1 -9 -3 -9 vhcurveto + 8 -4 rlineto + 30 28 14 31 34 vvcurveto + -9 9 11 -6 12 hhcurveto + 32 18 22 25 22 hvcurveto + 9 11 10 8 10 5 -4 10 rcurveline + -2 -3 -5 0 -7 hhcurveto + -6 -7 4 7 -6 hvcurveto + -18 20 rlineto + 14 -14 -15 7 -16 hhcurveto + -14 -11 -4 -8 -7 hvcurveto + 34 -14 30 -30 28 vhcurveto + -8 -4 rlineto + 3 -9 1 -8 -8 vvcurveto + -22 -13 -16 -26 -7 vhcurveto + -21 -6 -11 -11 -16 vvcurveto + -6 2 -5 3 -4 vhcurveto + -4 -2 rlineto + -21 19 -10 23 26 vvcurveto + 45 32 30 45 vhcurveto + 30 -164 rmoveto + 2 vlineto + 15 8 10 10 6 12 rrcurveto + 24 -5 11 -10 -16 vvcurveto + -16 -11 -10 -24 -5 vhcurveto + -6 12 -10 10 -15 8 rrcurveto + endchar + + + 437 -81 callsubr + -241 -567 -107 callgsubr + endchar + + + 76 24 429 rmoveto + 83 -50 68 115 -83 48 rlineto + -30 -604 rmoveto + 70 32 264 544 -71 -34 rlineto + -59 -470 rmoveto + 83 -51 68 115 -83 49 rlineto + endchar + + + 270 -5 callsubr + -19 -46 -59 callsubr + -34 19 -9 32 -16 37 15 21 18 7 6 3 -11 1 -3 7 -21 1 -61 -1 -25 rrcurveto + -73 -67 -232 -102 -15 166 -5 52 18 62 2 45 rrcurveto + 8 -10 8 -8 -1 vhcurveto + -60 -9 -42 -27 -37 -34 -19 -47 -16 -48 -16 -49 32 43 46 33 64 10 rrcurveto + 11 2 2 -18 -9 vvcurveto + 1 -20 -3 -18 -3 -18 -48 -252 273 11 119 172 rrcurveto + endchar + + + 270 -5 callsubr + -14 -44 -59 callsubr + -29 22 -15 25 -17 45 6 16 4 12 -17 3 -50 -1 -25 -73 -67 -232 -102 -15 166 rrcurveto + -5 52 18 62 2 45 rrcurveto + 8 -10 8 -8 -1 vhcurveto + -60 -9 -42 -27 -37 -34 -19 -47 -16 -48 -16 -49 32 43 46 33 64 10 rrcurveto + 11 2 2 -18 -9 vvcurveto + 1 -20 -3 -18 -3 -18 -48 -252 273 11 119 172 rrcurveto + endchar + + + 124 -24 callgsubr + + + 124 -24 callgsubr + + + 485 -35 callgsubr + + + 485 -35 callgsubr + + + -19 320 755 rmoveto + -6 5 1 5 -2 3 -16 28 -25 25 -40 3 -140 9 -72 -182 19 -107 19 -45 30 -35 34 -31 53 -48 47 -87 -31 -101 -2 -7 10 1 2 4 28 54 32 53 3 78 rrcurveto + -9 84 -44 52 -46 47 -30 31 -36 30 -10 50 22 17 29 9 33 -1 45 -2 34 -28 3 -44 1 -13 18 9 4 8 18 40 12 43 12 43 rrcurveto + -214 -670 -21 callsubr + + + 80 -29 callsubr + 173 hmoveto + -59 -61 rlineto + -20 vlineto + 42 -14 21 -26 -86 callgsubr + 23 20 -57 callsubr + 37 -87 callgsubr + endchar + + + 80 -8 callgsubr + 172 hmoveto + 58 61 rlineto + 21 vlineto + -42 14 -21 25 39 vvcurveto + 5 48 14 47 callgsubr + -12 -38 -35 vvcurveto + -28 8 -25 14 -21 vhcurveto + -21 14 15 -11 14 hhcurveto + endchar + + + 80 -7 callgsubr + 173 hmoveto + -59 -61 rlineto + -21 vlineto + 42 -14 21 -25 -86 callgsubr + 23 19 -57 callsubr + 38 -87 callgsubr + endchar + + + -93 -8 callgsubr + endchar + + + -93 -7 callgsubr + endchar + + + -93 -29 callsubr + endchar + + + 105 -27 callsubr + endchar + + + 46 375 139 rmoveto + 15 8 3 31 -20 3 -7 1 -5 -3 -5 -6 rrcurveto + 1 vlineto + -13 -15 -15 -9 -18 -5 -96 -25 -110 -12 -90 -32 -9 -4 -3 -4 6 -5 8 -7 26 -10 44 -13 44 -13 27 -9 11 -2 85 -17 43 18 31 59 13 26 14 26 21 18 rrcurveto + endchar + + + 105 -27 callsubr + -197 -506 -104 callsubr + endchar + + + 99 198 719 -98 callgsubr + 59 -490 -90 callgsubr + + + 105 334 600 -98 callgsubr + 22 -224 -70 callgsubr + + + 517 349 126 -25 callgsubr + + + 199 550 416 rmoveto + -5 -1 -13 -2 -22 -4 -22 -4 -18 0 -16 4 -14 3 -9 9 -6 16 -6 16 -9 22 -13 28 -54 -125 rcurveline + 13 -44 13 -44 -1 -57 -32 -29 -40 -24 -48 -19 -48 -19 -54 -4 -59 11 -45 19 -15 36 15 60 11 44 30 53 16 36 8 23 -12 5 -8 -16 -64 -116 -29 -90 6 -64 rrcurveto + 6 -64 22 -42 40 -19 40 -19 47 0 56 21 56 21 46 36 37 53 35 51 23 54 12 58 76 11 76 14 74 17 74 17 63 44 52 70 17 22 16 25 14 28 rrcurveto + 14 28 -2 -60 callsubr + -25 7 -31 -6 -31 -6 -23 -10 -16 -14 -45 -45 -64 -68 -44 -48 -17 -19 -9 -10 -1 -1 rrcurveto + 235 88 34 callgsubr + 38 47 26 29 16 39 -15 11 -20 rrcurveto + endchar + + + 735 293 8 callgsubr + 74 11 75 16 75 23 75 23 62 46 51 68 17 22 16 25 14 28 rrcurveto + 14 28 -3 26 -103 callsubr + -23 -10 -16 -14 -45 -45 -64 -68 -44 -48 -17 -19 -10 -10 -1 -1 -31 -7 -82 -20 -4 46 -1 12 -2 15 -3 19 rrcurveto + -4 19 -8 1 -11 -17 -68 -102 rcurveline + 10 -28 22 -60 -2 -33 rrcurveto + 0 0 -100 callsubr + -27 -123 92 -100 43 -47 77 -30 109 -14 rrcurveto + 1028 469 17 callgsubr + 15 40 -15 11 -20 rrcurveto + endchar + + + 357 -84 callsubr + + + 414 -52 callsubr + + + 357 -26 callgsubr + + + 485 -51 callsubr + + + 469 -36 callgsubr + + + 611 -53 callsubr + + + 417 -32 callgsubr + + + 620 -54 callsubr + + + 409 142 217 rmoveto + -1 hlineto + 1 -1 -41 -29 -18 -18 -36 -54 rlinecurve + 20 callgsubr + -3 rlineto + 1 0 2 1 hhcurveto + 28 10 20 -7 12 -25 4 -10 13 -5 22 1 61 3 75 24 49 14 40 15 37 17 34 22 60 39 39 51 34 65 14 28 -3 27 -21 25 -85 callsubr + rrcurveto + -31 -6 -23 -10 -16 -15 -64 -60 -60 -63 58 callgsubr + 27 -27 hhcurveto + -57 -45 -29 -28 -34 hvcurveto + 479 105 -80 callgsubr + -27 -69 -14 -70 -14 27 27 1 0 27 27 18 18 22 16 23 13 29 16 39 -45 callgsubr + + + 310 -37 callgsubr + + + 521 -55 callsubr + + + 383 -30 callgsubr + + + 1026 -16 callsubr + 59 17 62 21 67 28 99 42 58 61 46 89 14 28 -3 26 -21 25 rrcurveto + -85 callsubr + -61 -11 -5 -15 -39 -40 -36 -37 -47 -50 -34 -37 -17 -19 -10 -10 -1 -2 -29 -7 -15 5 -2 13 -2 13 -3 19 -5 26 -4 19 -7 1 -11 -17 -69 -102 rcurveline + -102 callsubr + rrcurveto + 0 -1 -100 callsubr + -26 -99 callsubr + rrcurveto + 960 465 -13 callsubr + + + -33 -84 callsubr + + + 23 -52 callsubr + + + -31 -26 callgsubr + + + 91 -51 callsubr + + + 75 -36 callgsubr + + + 210 -53 callsubr + + + 26 -32 callgsubr + + + -33 -84 callsubr + + + 277 -54 callsubr + + + 21 251 121 rmoveto + 4 -10 13 -5 22 1 60 3 77 21 47 16 40 15 37 18 34 22 61 39 38 51 34 65 12 callgsubr + -64 58 callgsubr + 28 -27 hhcurveto + -56 -1 -45 -28 -35 -28 rrcurveto + -1 hlineto + 1 -1 -9 -6 -10 -8 -11 -9 rlinecurve + -19 -16 -22 -26 -24 -37 20 callgsubr + -2 rlineto + 0 1 0 1 1 vhcurveto + 28 10 21 -6 12 -25 rrcurveto + 370 203 -80 callgsubr + -28 -68 -14 -71 -14 36 37 35 39 47 26 -60 callgsubr + + + -75 -37 callgsubr + + + 112 -55 callsubr + + + -7 -30 callgsubr + + + 569 426 289 rmoveto + 41 14 106 30 126 23 97 44 rlinecurve + -7 -20 -12 -18 -6 -20 -3 -9 -4 -13 8 -6 8 -6 10 5 4 8 35 75 32 79 27 82 1 3 -5 3 -2 -3 -13 -22 -26 -12 -26 -11 -105 -42 -125 -24 -123 -26 rrcurveto + -42 -9 -2 42 -23 47 -53 -132 rcurveline + 15 -47 10 -41 -1 -50 -64 -59 -99 -46 -118 21 -107 46 88 134 31 69 9 24 -13 3 20 callsubr + -28 146 211 42 61 10 35 25 67 rrcurveto + endchar + + + 143 606 361 rmoveto + 33 43 11 65 7 67 rrcurveto + 2 -3 0 -1 -7 vhcurveto + -11 -44 -33 -29 -49 -9 4 16 3 20 -1 17 rrcurveto + 8 -2 -4 -2 -3 vhcurveto + -8 -14 -5 -20 -13 -10 -118 -74 11 54 -31 65 -53 -132 rcurveline + 15 -47 10 -41 -1 -50 4 callgsubr + 42 61 10 36 25 67 49 16 14 9 8 5 rrcurveto + 2 -8 5 1 5 1 40 10 35 10 21 27 rrcurveto + endchar + + + 678 961 248 rmoveto + 18 6 18 8 19 9 rrcurveto + 5 9 5 2 2 hhcurveto + -5 1 3 -2 33 callsubr + 65 7 68 -2 7 -2 -2 -1 -10 -12 -46 -30 -27 -50 -9 5 19 2 17 -1 17 rrcurveto + 6 -2 1 -3 -6 vhcurveto + -8 -14 -5 -20 -12 -10 -20 -15 -31 -17 -33 -2 rrcurveto + -1 vlineto + -17 1 -9 9 -1 17 -1 17 -1 15 -2 12 -4 19 -7 1 -11 -17 -69 -102 rcurveline + -102 callsubr + rrcurveto + 0 -1 -100 callsubr + -26 -99 callsubr + 49 -6 57 -2 65 3 143 6 130 36 97 58 53 32 39 42 25 51 rrcurveto + 5 11 2 6 1 3 6 1 rcurveline + endchar + + + 321 652 304 rmoveto + 1 2 -5 4 -2 -2 -14 -22 -25 -14 -26 -10 -41 -16 -55 -16 -70 -15 -137 -30 -116 -25 -141 -25 -21 -135 rcurveline + 231 50 106 30 130 25 94 42 rlinecurve + -4 -10 -5 -10 -5 -9 -4 -8 -20 25 callgsubr + + + 361 690 274 rmoveto + 1 2 -5 4 -2 -2 -14 -22 -25 -14 -26 -10 -19 -7 -38 -12 -60 -18 -102 -30 -143 -35 -124 1 rrcurveto + -55 -31 15 29 -8 hvcurveto + -13 -34 -13 -42 -13 -51 -79 callgsubr + 30 -3 38 2 48 6 48 6 49 9 52 11 93 20 111 32 74 33 -8 -19 -11 -19 -6 -20 -6 -14 0 -9 6 -4 rrcurveto + 9 -7 7 2 6 12 37 79 32 78 25 78 rrcurveto + endchar + + + 332 682 286 rmoveto + 1 4 -2 3 -3 -2 -9 -8 -7 -12 -11 -6 -104 -60 -355 -99 -106 27 -26 7 -13 34 5 31 rrcurveto + 2 -2 1 -2 -3 vhcurveto + -42 -56 -33 -110 67 -33 58 -28 282 60 212 93 -26 -59 rcurveline + -11 -25 24 -16 10 20 39 81 45 114 9 40 rrcurveto + endchar + + + 475 799 302 rmoveto + -61 callgsubr + -14 -6 -42 -14 -70 -21 -124 -38 -177 -43 -147 -6 -68 -3 -38 14 -9 31 -13 -34 -13 -42 -13 -51 -79 callgsubr + 36 -4 49 4 61 9 rrcurveto + 61 9 62 13 65 15 103 25 135 38 80 35 -4 -10 -5 -10 -5 -9 -5 -8 -19 25 callgsubr + + + 385 713 425 rmoveto + 1 2 -6 4 -2 -2 -14 -22 -24 -14 -26 -10 -25 -10 -36 -11 -44 -11 -83 -21 -98 -24 -82 -20 -39 -10 -27 -8 -15 -7 -32 -15 -28 -19 -24 -30 -26 -33 -22 -37 -19 -40 rrcurveto + -19 -40 -10 -28 -3 -14 rrcurveto + -6 8 0 3 3 vhcurveto + 10 16 12 15 14 15 35 38 27 29 56 15 33 9 37 9 39 10 44 11 60 18 76 22 76 22 57 20 37 17 -62 -140 rcurveline + 22 18 28 62 69 149 22 68 rlinecurve + endchar + + + 525 847 435 rmoveto + 1 -5 5 -2 -3 vhcurveto + -14 -22 -24 -13 -26 -10 -63 -25 -57 -17 -51 -9 -109 -19 -85 -20 -81 -51 -42 -27 -45 -42 -47 -61 -105 callgsubr + 17 21 18 19 18 19 67 69 61 30 138 24 95 17 81 23 67 30 -4 -10 -4 -10 -5 -9 rrcurveto + -4 -8 -20 -41 12 -8 9 -7 8 3 6 12 38 81 32 78 24 76 rrcurveto + endchar + + + 226 -31 callgsubr + + + 314 -50 callsubr + + + 342 181 190 rmoveto + -6 -1 -5 -1 -6 -1 -61 -9 -40 41 callgsubr + -15 9 -13 9 -13 10 2 11 17 20 20 26 12 23 4 26 5 44 8 34 11 131 27 163 43 104 46 -4 -10 -4 -10 -5 -9 -5 -8 -20 -40 13 -9 rrcurveto + 9 -7 8 3 6 12 35 75 32 78 27 82 rrcurveto + -61 callgsubr + -59 -24 -167 -47 -87 -18 -64 -14 -39 -8 -12 -2 rrcurveto + endchar + + + 427 749 288 rmoveto + -1 0 0 -1 -1 hvcurveto + -11 -18 -22 -15 -32 -12 -114 -45 -140 -24 -131 -28 rrcurveto + -8 -44 -38 -7 -43 hhcurveto + -57 -39 20 53 -4 hvcurveto + 5 vlineto + 28 13 40 25 51 vhcurveto + -20 callsubr + -24 -103 callgsubr + -21 -20 vvcurveto + -55 -98 callsubr + 19 18 -1 21 hhcurveto + 34 36 4 7 39 hvcurveto + 62 12 56 11 49 12 87 23 87 23 75 34 -4 -10 -5 -10 -5 -9 rrcurveto + -7 -13 -8 -18 -16 vvcurveto + -8 6 -5 7 5 4 4 7 4 vhcurveto + 38 81 32 78 24 76 rrcurveto + 1 vlineto + 1 -2 3 -2 vhcurveto + endchar + + + 181 -45 callsubr + + + 1167 -16 callsubr + 85 24 rcurveline + 53 15 56 14 59 14 59 14 53 18 49 22 -4 -10 -4 -11 -5 -9 -4 -8 -21 -39 13 -9 9 -7 8 2 91 callgsubr + -61 callgsubr + -102 -41 -164 -31 -118 -27 -27 -6 -14 7 -1 19 -1 19 -2 16 -3 14 -4 19 -7 1 -11 -17 -69 -102 rcurveline + -102 callsubr + rrcurveto + 0 -1 -100 callsubr + -26 -99 callsubr + rrcurveto + endchar + + + -46 201 57 rmoveto + 2 -14 19 -6 16 4 21 7 16 8 17 8 rrcurveto + 2 4 7 5 5 hhcurveto + -4 1 3 -3 4 hhcurveto + 26 58 28 21 16 hvcurveto + 33 43 12 64 -1 callsubr + 21 -1 17 rrcurveto + 8 -3 -5 88 callgsubr + -44 -33 -38 -2 -6 1 3 13 3 13 -2 12 -1 4 -2 16 -2 -7 -22 -69 -129 -10 -52 -8 -55 -140 rcurveline + 90 29 60 5 51 23 rrcurveto + endchar + + + 52 356 166 rmoveto + 4 17 2 12 -1 8 rrcurveto + 0 -4 20 -2 -6 vhcurveto + -9 -29 -32 -23 -53 -16 -53 -16 -43 -6 -33 2 -42 2 -42 11 -9 33 -13 -34 -13 -42 -13 -51 -79 callgsubr + 82 -8 102 29 58 25 2 -16 13 -6 22 6 rrcurveto + 20 6 17 8 18 8 rrcurveto + 5 9 5 3 2 hhcurveto + -4 1 3 -3 4 52 callgsubr + -2 7 -1 -2 -1 -10 -12 -46 -31 -27 -50 -9 5 18 2 17 -1 18 rrcurveto + 5 -1 0 -3 -4 vhcurveto + -8 -14 -6 -21 -12 -9 -20 -16 -31 -17 -34 -1 rrcurveto + endchar + + + -31 217 33 rmoveto + 2 -14 19 -6 16 4 21 7 16 7 17 8 rrcurveto + 2 4 7 6 5 hhcurveto + -4 1 3 -3 4 hhcurveto + 26 58 27 21 16 hvcurveto + 33 43 12 65 -1 callsubr + 20 -1 17 rrcurveto + 8 -3 -4 88 callgsubr + -21 -16 -32 -18 -33 -1 rrcurveto + -1 0 1 -1 hhcurveto + 3 13 3 12 -2 12 -1 4 -2 17 -2 -7 -18 -54 -158 -51 -36 60 rrcurveto + -7 11 -3 15 19 vvcurveto + 7 1 0 -6 -7 vhcurveto + -46 -53 -28 -110 66 -33 44 -21 95 29 39 18 rrcurveto + endchar + + + 171 476 179 rmoveto + 4 17 1 12 -1 8 rrcurveto + 0 -3 21 -2 -7 vhcurveto + -11 -34 -34 -23 -58 -13 -58 -13 -44 -8 -30 -4 -46 -6 -44 -1 -40 4 -40 4 -24 14 -7 26 -13 -34 -13 -43 -13 -51 -91 callsubr + 48 -4 58 4 69 12 rrcurveto + 53 9 90 18 44 19 2 -16 13 -6 22 6 16 5 18 8 20 10 rrcurveto + 1 3 9 6 4 hhcurveto + -4 1 2 -3 67 callgsubr + 64 7 68 rrcurveto + 3 -4 -5 -1 -3 vhcurveto + -11 -46 -32 -27 -50 -9 5 18 3 17 -1 18 -1 6 -2 1 -2 -6 -8 -14 -5 -21 -12 -9 -20 -15 -32 -18 -34 -1 rrcurveto + endchar + + + 83 501 390 rmoveto + -4 -30 -21 -25 -39 -19 -39 -19 -21 6 -2 31 -1 17 -7 12 -12 6 -16 8 -21 -2 -26 -10 -26 -10 -26 -16 -27 -19 -46 -32 -58 -51 -33 -39 -16 -19 -17 -17 -13 -24 rrcurveto + -13 -32 -14 -63 -3 -38 -105 callsubr + 41 66 10 26 55 51 33 29 52 40 40 21 28 15 42 16 -5 -45 -4 -33 14 -14 32 6 32 6 24 7 15 7 rrcurveto + 5 9 5 2 2 hhcurveto + -5 3 -2 5 58 39 26 52 19 vhcurveto + 19 52 12 49 5 44 -2 8 -1 -2 -2 -11 -8 -34 -37 -65 -47 17 5 19 1 18 -1 17 rrcurveto + 7 -4 -4 -3 vvcurveto + endchar + + + 245 496 315 rmoveto + -50 3 -55 -23 -62 -48 -62 -48 -44 -42 -27 -35 -105 callgsubr + 34 41 35 38 43 31 rrcurveto + 37 52 36 18 20 hhcurveto + 20 16 -6 -11 11 hvcurveto + 11 -11 14 -10 15 -9 15 -9 27 5 41 21 rrcurveto + 2 3 9 5 5 hhcurveto + -4 1 2 6 callsubr + 3 -4 -5 -1 -3 vhcurveto + -12 -46 -31 -28 -49 -9 5 19 2 18 -1 17 -1 5 0 1 -3 -5 -8 -13 -5 -22 -12 -9 -10 -7 -74 -53 -15 37 rrcurveto + 1 vlineto + -1 -1 rlineto + 14 -10 -5 16 -24 hhcurveto + endchar + + + 49 -31 callgsubr + + + 18 -50 callsubr + + + -34 237 203 rmoveto + -24 -34 -7 -14 -45 hvcurveto + -52 -16 -31 -19 -11 -21 -12 -23 -7 -27 -10 -24 rrcurveto + -1 -2 -9 -14 -3 vvcurveto + -1 vlineto + -1 -4 0 -4 -3 vvcurveto + -10 6 -11 10 6 6 4 9 6 vhcurveto + 11 11 13 10 12 7 21 8 27 9 30 9 rrcurveto + 5 14 11 2 7 hhcurveto + 8 3 -3 -5 hvcurveto + -11 vlineto + -21 10 -11 20 4 4 0 1 5 vhcurveto + 32 6 24 7 15 7 rrcurveto + 5 9 4 2 2 hhcurveto + -4 1 3 6 callsubr + 1 -1 0 0 -3 0 -3 -3 -1 vhcurveto + -11 -46 -31 -27 -50 -9 rrcurveto + 4 15 2 15 15 vvcurveto + 8 vlineto + 3 0 1 -1 -1 -1 -2 -2 -1 vhcurveto + -8 -14 -6 -21 -12 -9 -14 -11 -21 -11 -28 -11 rrcurveto + -3 -7 -7 -1 -5 hhcurveto + -12 -6 9 17 hvcurveto + 12 vlineto + 10 -10 2 -12 vhcurveto + endchar + + + 216 521 236 rmoveto + -1 0 -1 -1 hvcurveto + -13 -21 -24 -17 -35 -16 rrcurveto + -30 -68 -92 -22 -93 hhcurveto + -69 -55 14 65 28 13 40 26 51 hvcurveto + -2 callgsubr + -43 9 50 -14 62 hhcurveto + 39 49 5 10 58 hvcurveto + 84 14 63 16 43 20 rrcurveto + -12 2 7 -6 13 hhcurveto + 5 5 1 1 6 hvcurveto + 17 5 18 7 19 10 rrcurveto + 5 9 5 3 2 hhcurveto + -5 1 2 -2 5 hhcurveto + 29 58 31 17 13 hvcurveto + 33 42 11 64 7 68 rrcurveto + 1 1 0 -1 vhcurveto + -1 hlineto + -1 -1 -1 -1 -1 -3 -12 -46 -32 -27 -49 -9 rrcurveto + 4 16 3 16 17 vvcurveto + 4 vlineto + 3 -1 1 -1 -1 -1 -1 -3 -1 vhcurveto + -8 -14 -5 -20 -12 -10 -20 -15 -32 -18 -34 -1 rrcurveto + -1 -1 1 0 hvcurveto + 3 15 1 11 7 vvcurveto + 4 vlineto + 0 -2 15 -2 vhcurveto + endchar + + + 6 -45 callsubr + + + -86 127 229 rmoveto + -22 callsubr + -70 -144 rmoveto + -4 -4 0 -4 4 -4 73 -71 rcurveline + 4 -4 4 1 4 4 89 92 rcurveline + 4 4 -1 4 -4 4 -72 70 rcurveline + -4 4 -4 0 -4 -4 rrcurveto + endchar + + + -86 57 363 rmoveto + 89 -92 4 -4 4 0 4 4 rlinecurve + 72 70 4 4 1 4 -4 4 rlinecurve + -89 92 -4 4 -4 1 -4 -4 rlinecurve + -73 -71 -4 -4 0 -4 4 -4 rlinecurve + 70 -144 -5 callgsubr + + + 12 -12 callgsubr + + + -99 140 7 rmoveto + 11 19 1 26 6 22 22 86 24 82 35 72 rrcurveto + 34 3 32 5 29 vhcurveto + -2 1 -1 0 -1 -3 -35 -79 -33 -84 -25 -94 -25 82 -36 93 -40 85 -11 -33 -11 -34 -8 -31 45 -96 44 -96 21 -118 2 -5 7 7 2 3 rrcurveto + endchar + + + -99 140 276 rmoveto + 11 19 1 26 6 22 22 86 24 82 35 72 rrcurveto + 34 3 32 5 29 vhcurveto + -2 1 -1 0 -1 -3 -35 -79 -33 -84 -25 -94 -25 82 -36 93 -40 85 -11 -33 -11 -34 -8 -31 45 -96 44 -96 21 -118 2 -5 7 7 2 3 rrcurveto + endchar + + + 12 -12 callgsubr + + + 181 517 92 rmoveto + -134 6 -64 -3 -121 -12 96 75 265 336 -61 88 -35 -22 -41 -22 -44 -19 -18 -216 -149 -150 -101 -77 -27 -20 -33 -17 -19 -24 -4 -5 -4 -14 8 2 rrcurveto + 168 54 6 -6 153 hvcurveto + 36 28 37 34 38 32 rrcurveto + endchar + + + -99 304 64 rmoveto + -94 5 -45 -2 -84 -9 67 53 185 235 -42 61 -25 -15 -29 -15 -30 -14 -13 -151 -104 -105 -71 -54 -19 -14 -23 -12 -13 -16 -3 -4 -3 -10 6 2 rrcurveto + 117 38 4 -4 107 hvcurveto + 25 19 26 24 27 22 rrcurveto + endchar + + + -99 304 333 rmoveto + -94 5 -45 -2 -84 -9 67 53 185 235 -42 61 -25 -15 -29 -15 -30 -14 -13 -151 -104 -105 -71 -54 -19 -14 -23 -12 -13 -16 -3 -4 -3 -10 6 2 rrcurveto + 117 38 4 -4 107 hvcurveto + 25 19 26 24 27 22 rrcurveto + endchar + + + -12 -22 rmoveto + -15 8 13 -18 24 hhcurveto + 9 7 3 6 6 hvcurveto + 27 26 4 55 4 48 -18 -17 rcurveline + -4 vlineto + -25 -10 -26 -21 -3 vhcurveto + -2 hlineto + -7 -7 5 8 -8 hvcurveto + -8 8 -3 12 15 vvcurveto + 12 vlineto + 2 1 0 2 vvcurveto + 1 vlineto + -15 -15 -1 -20 -8 -21 -10 -12 rlinecurve + -9 -7 -17 -5 -13 hhcurveto + -18 -9 12 16 -1 hvcurveto + 5 vlineto + 14 5 14 12 vvcurveto + 1 vlineto + -8 -5 -15 -5 -2 hvcurveto + -1 -1 -1 -1 -1 -1 0 -1 vvcurveto + -4 -15 -7 -24 -20 vvcurveto + -31 12 -20 32 -2 vhcurveto + 27 3 28 21 4 26 rrcurveto + endchar + + + 636 973 504 rmoveto + 2 4 -5 -4 0 vvcurveto + -32 -28 -36 -24 -42 -16 -92 -35 -93 -34 -107 -21 -91 51 -33 -53 -49 -70 -33 -48 -31 -50 -48 -33 -18 -13 -29 4 -10 19 -21 41 9 30 -1 46 -1 32 -6 28 -20 12 rrcurveto + -14 8 -22 -12 -22 -16 -82 -60 -14 -56 -32 -94 8 7 4 7 5 8 21 34 26 33 43 14 20 7 14 -14 8 -12 18 -26 -2 -76 11 -40 8 -30 19 -22 35 -2 rrcurveto + 83 26 45 158 71 56 42 33 4 -53 45 2 125 36 115 32 101 59 -14 -33 -16 -21 -13 -33 -3 -7 7 -10 15 19 48 74 41 83 39 83 rrcurveto + endchar + + + 15 309 4 rmoveto + 17 38 16 41 13 41 rrcurveto + 1 -4 6 -1 1 vhcurveto + -49 98 -11 161 22 138 -99 -4 -77 25 -63 35 -11 -34 -17 -38 -13 -34 -3 -8 -2 -12 9 -5 58 -31 67 -21 88 -2 -1 -8 -1 -17 -1 -6 -14 -141 23 -126 40 -99 rrcurveto + 2 -5 10 2 2 4 rrcurveto + endchar + + + -99 214 3 -32 callsubr + + + -99 214 272 -32 callsubr + + + 112 377 335 rmoveto + 34 38 29 33 11 51 -38 -13 -29 -23 -36 -20 -67 -38 -68 31 -23 45 -11 22 39 83 89 -45 55 -28 24 119 -95 -6 -66 -5 -218 -220 186 -75 rrcurveto + -59 -63 -110 -131 -91 vvcurveto + 1 -1 rlineto + 4 6 9 3 2 hvcurveto + 137 198 6 4 197 123 rrcurveto + endchar + + + -99 230 234 rmoveto + 24 27 20 23 8 36 -27 -9 -20 -16 -25 -14 -47 -27 -48 22 -16 31 -8 16 28 58 62 -32 38 -19 17 83 -66 -4 -46 -4 -153 -154 130 -52 rrcurveto + -41 -44 -77 -92 -64 vvcurveto + 1 hlineto + 2 5 6 2 1 hvcurveto + 96 139 4 2 138 86 rrcurveto + endchar + + + -99 230 504 rmoveto + 24 26 20 23 8 36 -27 -9 -20 -16 -25 -14 -47 -27 -48 22 -16 31 -8 16 28 58 62 -32 38 -19 17 83 -66 -4 -46 -4 -153 -154 130 -52 rrcurveto + -41 -44 -77 -92 -64 vvcurveto + 1 hlineto + 2 5 6 2 1 hvcurveto + 96 139 4 2 138 87 rrcurveto + endchar + + + -218 endchar + + + 62 11 rmoveto + -10 -12 -26 -17 -39 -19 -39 -19 -21 -12 -2 -5 10 -1 rcurveline + 83 6 58 31 30 59 rrcurveto + 9 18 5 15 12 vvcurveto + 10 -4 9 -6 6 vhcurveto + -10 10 -26 7 -43 2 rrcurveto + -18 hlineto + -32 -21 -5 -10 -8 hvcurveto + -16 -20 -12 -20 -9 -21 rrcurveto + -9 -21 -4 -12 -5 vvcurveto + 1 hlineto + 2 1 3 3 6 5 rrcurveto + 15 16 8 6 34 hhcurveto + 8 10 0 -1 10 hvcurveto + 36 -4 20 -4 6 -5 rrcurveto + endchar + + + -21 -69 rmoveto + 21 -4 18 10 15 27 21 36 3 34 -15 31 -32 66 -28 -59 -18 -43 -18 -44 -14 -44 47 -10 rrcurveto + -9 69 rmoveto + 9 4 9 9 10 vhcurveto + 9 10 11 -2 13 -11 19 -18 -3 -12 -24 -6 -24 -6 -13 3 -1 14 rrcurveto + endchar + + + 317 295 -19 callgsubr + + + -44 294 -19 callgsubr + + + 210 -83 callsubr + + + 341 -47 callsubr + + + 271 -23 callgsubr + + + 401 -46 callsubr + + + 312 -44 callsubr + + + 402 -34 callgsubr + + + 254 -43 callsubr + + + 221 203 603 rmoveto + 21 -321 -101 callsubr + 260 -351 rmoveto + 14 28 -3 26 -103 callsubr + -24 -10 -15 -15 -60 -56 -69 -71 -52 -64 -64 -24 -42 -30 -21 -36 -21 -36 -25 -52 -30 -67 21 -2 rcurveline + 22 55 30 34 39 13 39 13 39 12 42 12 51 15 49 -61 callsubr + 46 57 38 74 rrcurveto + -97 -34 -80 callgsubr + -27 -67 -15 -71 -13 36 36 33 40 47 25 29 16 40 -45 callgsubr + + + 493 -49 callsubr + + + 314 209 569 rmoveto + 22 -320 -101 callsubr + -94 -599 rmoveto + 13 5 13 5 13 4 54 16 48 14 51 24 37 18 36 32 34 46 17 22 17 18 callgsubr + -14 rrcurveto + -64 -60 -59 -64 -58 -67 -75 -16 -81 -49 -30 -63 -6 -13 -15 -32 -3 -13 42 -29 rcurveline + 46 31 48 34 53 24 rrcurveto + 257 214 rmoveto + 7 -14 -1 -9 -8 -4 -57 -28 -66 -13 -71 -14 36 37 33 38 47 26 29 15 40 -14 11 -20 rrcurveto + endchar + + + 222 -33 callgsubr + + + 538 -38 callgsubr + + + 197 180 561 rmoveto + 21 -321 74 117 -21 321 rlineto + 259 -352 rmoveto + 14 28 -2 27 -103 callsubr + -24 -11 -15 -14 -60 -57 -70 -70 -52 -64 -55 -21 -39 -26 -21 -29 -21 -29 -22 -39 -22 -50 21 -11 rcurveline + 23 35 28 22 34 10 34 10 35 10 35 10 51 15 48 -61 callsubr + 45 56 39 74 rrcurveto + -96 -33 17 callgsubr + 16 40 -16 11 -20 rrcurveto + endchar + + + -158 -83 callsubr + + + -37 -47 callsubr + + + -104 -23 callgsubr + + + 20 -46 callsubr + + + -65 -44 callsubr + + + 21 -34 callgsubr + + + -99 -43 callsubr + + + -38 316 622 rmoveto + 22 -321 -101 callsubr + 260 -351 rmoveto + 14 28 -2 -60 callsubr + -25 7 -31 -6 -31 -6 -24 -10 -15 -14 -60 -57 -69 -71 -52 -64 -13 -5 -30 -8 -49 -12 -49 -12 -28 -7 -9 -6 -35 -23 -27 -28 -16 -33 rrcurveto + -16 -33 -21 -43 -24 -54 21 -2 rcurveline + 30 66 46 38 62 9 62 9 62 15 63 21 51 15 49 -61 callsubr + 45 56 39 75 rrcurveto + -97 -34 34 callgsubr + 39 47 26 -60 callgsubr + + + -158 -83 callsubr + + + 125 -49 callsubr + + + -145 209 571 rmoveto + 22 -321 -101 callsubr + -94 -598 rmoveto + 13 5 13 4 13 4 54 16 48 15 51 24 37 18 36 32 35 46 17 22 16 18 callgsubr + -15 rrcurveto + -64 -60 -60 -63 -57 -67 -77 -17 -78 -47 -31 -64 -6 -13 -15 -31 -3 -14 42 -30 rcurveline + 1 hlineto + 4 3 3 2 2 2 42 29 46 32 49 22 rrcurveto + 257 213 16 callsubr + 33 30 callsubr + + + -151 -33 callgsubr + + + 137 -38 callgsubr + + + 26 380 599 rmoveto + 22 -321 73 118 -21 320 rlineto + -171 -612 rmoveto + 43 8 42 10 42 14 51 15 48 20 46 25 75 41 45 54 39 74 14 28 -3 26 -103 callsubr + -23 -9 -16 -15 -60 -56 -70 -72 -52 -63 rrcurveto + -27 -10 -47 -9 -35 -9 -41 -10 -39 -9 -37 -9 -37 -9 -32 -21 -27 -35 -25 -30 -15 -35 -18 -40 rrcurveto + -1 vlineto + 21 -17 17 21 20 17 23 11 rlinecurve + 57 27 76 15 69 13 rrcurveto + 334 228 -99 callgsubr + -9 -8 -4 -57 -27 -68 -14 -70 -14 37 36 33 40 47 25 29 16 40 -15 11 -20 rrcurveto + endchar + + + -26 143 -98 callgsubr + endchar + + + 319 -73 callgsubr + 327 -358 -107 callgsubr + endchar + + + 437 462 468 -92 callsubr + 157 -126 -80 callsubr + + + -117 210 521 -92 callsubr + 7 -354 -71 callgsubr + + + 3 312 575 -107 callsubr + -70 -264 -95 callsubr + + + 437 544 579 -107 callgsubr + 75 -237 -80 callsubr + + + 50 219 4 rmoveto + 71 111 -16 143 -64 110 -4 7 19 15 10 8 5 -6 4 -6 7 -4 28 -17 35 19 17 15 41 38 11 69 6 74 1 8 -9 -18 -1 -4 -7 -36 -33 -29 -43 10 rrcurveto + -14 3 -12 17 3 21 1 3 -5 10 -3 -6 -5 -8 -7 -26 -5 -7 -21 -29 -61 -19 -37 26 -27 19 -15 39 -15 31 -19 -40 -15 -43 -15 -41 21 -52 34 -40 27 -45 rrcurveto + 52 -85 63 -99 -14 -142 rrcurveto + -2 9 4 2 4 vhcurveto + endchar + + + -99 141 3 rmoveto + 50 78 -11 100 -45 77 -3 5 14 10 7 6 3 -5 3 -4 5 -3 19 -12 25 14 12 10 28 27 8 48 4 52 1 6 -6 -13 -1 -3 -5 -25 -23 -20 -30 7 rrcurveto + -10 2 -8 12 2 14 1 3 -4 7 -2 -5 -4 -5 -4 -18 -4 -5 -15 -21 -42 -13 -26 18 -19 14 -11 27 -10 22 -13 -28 -11 -31 -10 -28 14 -37 24 -28 19 -31 rrcurveto + 36 -60 44 -69 -9 -99 -85 callgsubr + + + -99 141 272 rmoveto + 50 78 -11 100 -45 77 -3 5 14 10 7 6 3 -5 3 -4 5 -3 19 -11 25 13 12 10 28 27 8 48 4 52 1 6 -6 -13 -1 -3 -5 -25 -23 -20 -30 7 rrcurveto + -10 2 -8 12 2 14 1 3 -4 7 -2 -5 -4 -5 -4 -18 -4 -5 -15 -21 -42 -13 -26 18 -19 14 -11 27 -10 22 -13 -28 -11 -31 -10 -28 14 -37 24 -28 19 -31 rrcurveto + 36 -60 44 -69 -9 -99 -85 callgsubr + + + 147 74 -107 callgsubr + endchar + + + 147 74 -107 callgsubr + endchar + + + 437 371 648 -98 callgsubr + 156 -202 -80 callsubr + + + -78 262 571 rmoveto + 2 -2 1 0 vhcurveto + -41 10 -43 10 -48 -6 -113 -13 -8 -212 52 -89 39 -66 51 -101 -12 -107 6 4 3 5 1 5 17 64 31 63 -9 78 -22 79 -54 84 -29 72 45 13 52 -9 41 -12 rrcurveto + 5 -1 6 7 2 7 rrcurveto + endchar + + + -99 214 400 rmoveto + 1 -1 1 0 vhcurveto + -29 7 -30 7 -33 -4 -94 callsubr + 31 9 37 -6 28 -9 rrcurveto + 4 4 4 5 1 hvcurveto + endchar + + + -99 214 669 rmoveto + 1 -1 1 0 vhcurveto + -29 7 -30 7 -33 -4 -94 callsubr + 31 9 37 -6 28 -9 rrcurveto + 4 4 4 5 1 hvcurveto + endchar + + + 28 210 372 rmoveto + 57 -18 42 17 26 51 26 51 11 52 -5 56 rrcurveto + 4 -2 -1 -3 -6 vhcurveto + -3 -6 -2 -3 -2 vvcurveto + -40 -68 -49 -30 -58 7 -58 7 -45 38 -33 68 -19 -39 -16 -43 -15 -42 11 -26 13 -25 15 -21 46 -65 36 -63 37 -79 24 -52 9 -61 -7 -71 rrcurveto + -1 -3 12 9 0 vvcurveto + 35 56 16 60 -5 66 -5 66 -18 60 -32 56 rrcurveto + endchar + + + -99 142 260 -15 callgsubr + + + -99 142 529 -15 callgsubr + + + 65 -37 -92 callsubr + endchar + + + 65 -37 -92 callsubr + endchar + + + 18 -10 -104 callsubr + endchar + + + 18 -10 -104 callsubr + endchar + + + 315 630 724 -107 callgsubr + -542 -690 -72 callgsubr + + + -92 -34 rmoveto + 75 74 -46 -89 101 42 28 11 26 15 16 22 12 16 16 21 -15 18 -12 14 -27 -8 -11 -10 -23 -21 -22 -22 -20 -24 rrcurveto + -1 -3 -2 0 -2 hhcurveto + -35 42 -55 -64 -10 -40 -1 -4 8 6 2 2 rrcurveto + 182 90 rmoveto + 2 -3 1 -4 -4 -2 -20 -10 -24 -5 -25 -5 13 13 12 14 17 9 10 5 14 -4 4 -8 rrcurveto + endchar + + + 127 230 8 -97 callgsubr + + + 127 230 8 -97 callgsubr + + + 127 465 619 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -235 -611 -97 callgsubr + + + 127 396 559 -106 callgsubr + -166 -551 -97 callgsubr + + + 251 -21 callgsubr + 246 -158 rmoveto + 60 119 -64 -12 -64 -12 -64 -12 rlinecurve + -60 -119 64 12 64 12 64 12 rlinecurve + endchar + + + 251 -40 callsubr + + + 251 296 573 -106 callgsubr + -218 -549 -39 callsubr + + + 251 339 671 -104 callsubr + -261 -647 -39 callsubr + + + 335 344 463 -29 callgsubr + + + 335 67 158 rmoveto + -46 33 -5 -10 -5 -19 -5 -30 rlinecurve + -9 -56 3 -45 41 -17 44 -18 62 0 55 9 161 25 130 60 97 86 29 26 30 25 11 45 -125 -71 -129 -57 -183 -11 -55 -3 -53 6 -50 17 rrcurveto + 1 1 2 1 2 vhcurveto + endchar + + + 335 291 612 -106 callgsubr + 53 -149 -29 callgsubr + + + 317 295 479 rmoveto + 22 -321 74 118 -22 321 rlineto + 220 -109 -107 callsubr + -8 -298 -14 callgsubr + + + 105 439 470 -107 callsubr + 9 -198 -70 callgsubr + + + -133 30 263 rmoveto + -2 -2 -1 -1 -2 vvcurveto + -3 2 -3 3 -2 vhcurveto + 83 -70 rlineto + -2 2 3 -1 2 hhcurveto + 2 1 2 2 2 hvcurveto + 75 91 rlineto + 2 2 1 2 2 vvcurveto + 2 -2 3 -3 2 vhcurveto + -83 70 rlineto + 2 -2 -3 1 -2 hhcurveto + -2 -2 -1 -2 -2 hvcurveto + endchar + + + -99 72 184 -26 callsubr + 48 rlineto + 2 -1 -3 1 -1 hhcurveto + -1 -2 -1 -2 -1 hvcurveto + endchar + + + -99 72 453 -26 callsubr + 49 rlineto + 1 -1 -3 1 -1 hhcurveto + -1 -2 -1 -1 -1 hvcurveto + endchar + + + + + + + + rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + return + + + rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + return + + + -1 callgsubr + 15 36 27 41 40 47 return + + + -6 9 0 3 3 vhcurveto + return + + + -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 return + + + -1 -12 -4 rrcurveto + -18 return + + + -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 return + + + 14 20 14 20 17 15 22 11 return + + + rmoveto + 7 -14 -1 return + + + rmoveto + 8 -125 29 46 -8 125 rlineto + 82 -159 rmoveto + 13 18 18 15 -16 20 -13 16 -30 -9 -12 -11 -25 -24 -23 -25 -23 -26 -34 -6 -38 -3 -40 1 rrcurveto + -2 -2 -4 -1 2 hvcurveto + 29 -17 15 -15 25 -2 11 -1 13 1 17 4 51 13 38 21 26 35 rrcurveto + -19 9 rmoveto + 2 -3 2 -6 -4 -2 -22 -11 -27 -5 -27 -5 14 14 13 15 18 10 11 6 15 -4 5 -9 rrcurveto + return + + + rmoveto + 180 35 163 279 -129 131 -12 12 -28 13 -15 -17 -32 -36 -16 -48 -22 -44 -10 -20 -3 -24 15 -17 17 -19 43 -2 32 7 7 -10 7 -20 -7 -7 -20 -23 -25 -19 -31 -12 rrcurveto + -115 -47 -121 -40 -104 -58 -6 -3 0 -10 7 -1 73 -7 79 -7 73 14 rrcurveto + endchar + + + 16 61 -8 38 -32 17 -32 17 -35 -14 -37 -44 return + + + vhcurveto + 1 2 0 1 1 vvcurveto + return + + + -11 -5 90 callgsubr + 39 47 25 28 15 return + + + -39 -5 -12 0 -6 6 -1 return + + + -9 -8 -4 -57 -27 -68 -14 -70 -14 36 return + + + -84 92 callgsubr + return + + + rmoveto + 76 109 31 145 -59 124 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 4 callgsubr + rrcurveto + endchar + + + -81 callgsubr + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 return + + + 48 callgsubr + 6 5 5 9 7 vhcurveto + return + + + 35 vvcurveto + 28 -8 25 -14 21 vhcurveto + 21 -14 -15 11 -14 hhcurveto + return + + + -39 vvcurveto + -5 -48 -13 -31 -24 -14 rrcurveto + -21 vlineto + 22 return + + + rrcurveto + -2 6 3 1 3 vhcurveto + endchar + + + -33 -21 -41 -16 93 callgsubr + return + + + 105 61 84 46 105 61 rlinecurve + 33 117 return + + + -6 10 -4 rrcurveto + 6 -2 return + + + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + return + + + rmoveto + 7 -14 0 -8 -8 -4 -57 return + + + 1 -29 27 -15 28 -3 return + + + -12 6 hvcurveto + 28 -58 return + + + 34 30 46 30 46 return + + + -25 -18 vvcurveto + endchar + + + -24 -9 -23 -11 -22 -11 return + + + 2 -33 4 -49 return + + + 648 -186 rmoveto + 4 4 -12 -3 -5 -1 -175 -46 -260 -39 -136 153 -78 88 247 211 55 48 40 35 43 36 32 46 27 38 64 138 -66 27 -64 27 -108 -20 -44 -31 -66 -47 -39 -153 75 -83 rrcurveto + -90 -82 -118 -209 30 -141 55 -261 426 67 163 198 rrcurveto + -446 594 rmoveto + 29 25 136 24 20 -59 -34 -32 -52 -32 -41 -30 -16 36 -27 30 -15 38 rrcurveto + return + + + rmoveto + 111 -74 277 53 103 122 67 79 40 106 -45 89 -25 49 -46 42 35 callgsubr + 38 15 21 18 rrcurveto + 11 12 21 -75 0 vvcurveto + -72 -72 -455 -111 17 200 4 53 24 42 20 36 -11 -3 -4 -9 -5 -8 -114 -174 15 -98 69 -46 rrcurveto + endchar + + + rmoveto + 50 226 -122 160 -114 -333 -40 -116 -21 -132 120 31 84 22 27 68 16 74 rrcurveto + -79 98 rmoveto + 13 -9 37 -78 -17 -11 -29 -18 -46 -17 -39 17 -6 3 -9 8 2 4 4 15 42 119 48 -33 rrcurveto + endchar + + + rmoveto + -1 7 -9 1 -3 -8 -16 -35 -23 -28 -30 -20 -64 -43 -79 -27 -81 -25 -236 -73 96 -17 156 -4 101 -3 67 33 45 54 31 37 33 84 13 67 rrcurveto + endchar + + + -158 -2 -120 35 -91 callgsubr + 11 18 18 18 61 58 75 43 90 28 90 28 86 14 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 return + + + 2 7 7 hvcurveto + 39 43 rlineto + 5 5 2 5 5 vvcurveto + 4 -2 6 -4 5 vhcurveto + -39 42 rlineto + 5 -6 return + + + 18 vhcurveto + -27 10 -35 17 -40 22 rrcurveto + 14 -26 -23 7 -20 hhcurveto + -11 -11 -2 -5 return + + + -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 return + + + 7 4 8 11 24 13 15 17 6 17 6 14 -13 11 -31 rrcurveto + return + + + -10 -15 -15 -23 16 callgsubr + return + + + -13 24 -16 20 -20 14 -20 14 -17 -4 -17 -22 -27 return + + + rrcurveto + 5 26 3 24 22 vvcurveto + 37 -8 return + + + 1 -5 6 -2 -3 vhcurveto + -11 -18 -21 -15 -32 -12 return + + + 29 16 39 -45 callgsubr + + + 14 -12 9 -18 14 -32 8 -45 4 -45 4 return + + + -35 1 29 40 26 42 18 51 52 -21 -1 return + + + -2 -1 hvcurveto + -10 -15 -15 -23 -103 callgsubr + return + + + -3 21 -5 20 -5 11 -6 2 -8 return + + + 2 -4 hhcurveto + -5 -4 -1 -5 -5 hvcurveto + return + + + rmoveto + 6 2 5 4 5 vhcurveto + 18 24 return + + + -13 7 -18 75 callgsubr + return + + + -70 vvcurveto + -29 6 -24 12 -18 vhcurveto + return + + + 4 21 5 19 6 17 4 14 return + + + -12 vvcurveto + -19 1 -36 12 return + + + -24 31 4 40 6 21 return + + + -6 -31 -1 -31 27 -27 35 -8 50 rrcurveto + endchar + + + -14 36 37 34 39 47 26 return + + + -16 257 rcurveline + 106 62 107 return + + + -16 11 -20 rrcurveto + endchar + + + -2 -2 vvcurveto + -2 3 return + + + 14 -12 9 -18 14 return + + + 90 28 86 15 82 3 53 112 rcurveline + return + + + -2 -1 0 -2 -1 hvcurveto + return + + + 7 19 rrcurveto + 2 6 1 return + + + rmoveto + 43 -27 -58 -24 -27 -10 -31 -11 return + + + 504 530 rmoveto + 22 -321 74 117 -22 321 rlineto + 198 -249 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -60 -63 -57 -67 rrcurveto + -15 -67 -127 -32 -87 hhcurveto + -64 -46 14 35 -27 hvcurveto + -8 10 -4 13 17 vvcurveto + 28 12 37 23 46 vhcurveto + 1 2 0 0 0 callgsubr + -49 11 61 -9 68 hhcurveto + 31 34 3 4 39 hvcurveto + 147 16 149 43 114 55 97 47 39 43 43 84 5 callgsubr + 35 39 47 26 rrcurveto + 5 8 9 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 561 367 rmoveto + -38 -36 -17 -16 -17 hvcurveto + -64 -60 -60 -64 -57 -67 rrcurveto + -2 -8 -7 0 -7 hhcurveto + -19 -6 4 24 hvcurveto + 11 vlineto + 7 -4 2 -9 vhcurveto + -6 hlineto + -50 -5 -46 -11 -41 -18 -18 -8 -14 -14 -11 -21 -11 -21 -10 -18 -8 -18 -88 callgsubr + 30 30 51 14 51 5 rrcurveto + 1 hlineto + 3 2 -2 -2 hvcurveto + -1 vlineto + -2 -1 -2 -1 vvcurveto + -19 19 -6 19 4 3 0 1 4 vhcurveto + 5 hlineto + 61 64 14 28 67 hvcurveto + 101 42 57 61 47 91 rrcurveto + 6 11 2 11 11 vvcurveto + 36 -31 34 -38 vhcurveto + -89 -110 rmoveto + 29 29 -17 -25 -5 -3 -3 -4 -2 hvcurveto + -57 -28 -67 -14 -71 -14 36 37 34 38 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + endchar + + + 439 300 rmoveto + -12 -3 -15 -2 -18 -1 -18 -1 -9 8 -1 20 -4 37 -32 12 -43 -15 -24 -8 -25 -14 -25 -17 -51 -34 -84 -75 -32 -48 -8 -10 -5 -7 -3 -4 -13 -32 -14 -63 -3 -38 rrcurveto + -104 callgsubr + 14 22 11 19 9 16 23 39 29 32 37 28 38 28 53 41 45 10 21 5 9 -10 -3 -24 -3 -21 10 -13 20 -3 20 -3 23 1 27 5 39 7 63 21 31 9 rrcurveto + 40 15 37 18 34 22 60 39 39 51 34 65 14 28 -2 26 -21 25 -17 20 -25 7 -31 -6 -31 -6 -23 -9 -16 -15 -64 -60 -60 -65 -57 -66 rrcurveto + 241 88 rmoveto + 7 -14 0 -92 callgsubr + 36 34 40 47 25 29 16 39 -14 11 -21 rrcurveto + endchar + + + -13 callgsubr + 69 -9 78 10 89 26 89 26 69 40 48 53 rrcurveto + 51 56 50 123 -46 93 -63 callgsubr + -37 -19 -46 -22 -41 -10 -19 -1 -33 19 -10 33 -17 38 18 19 16 5 6 8 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + -16 -14 -32 -15 -49 -18 -49 -18 -35 -12 -20 -4 rrcurveto + endchar + + + 375 628 rmoveto + 22 -320 74 117 -22 321 rlineto + 260 -352 rmoveto + 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -11 -15 -14 -60 -57 -70 -70 -52 -64 -29 -12 -32 -21 -36 -33 -36 -33 -27 -28 -19 -24 -105 callgsubr + 58 70 55 41 99 28 51 15 48 19 46 25 74 40 46 56 39 74 rrcurveto + -97 -33 9 callgsubr + + + 214 550 rmoveto + 22 -321 74 118 -22 321 rlineto + 198 -249 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -60 -64 -57 -66 rrcurveto + -1 vlineto + -2 -2 -35 -6 -34 -9 -32 -15 rlinecurve + -44 -20 -33 -40 -21 -48 -88 callgsubr + 28 28 39 18 42 8 64 12 66 20 68 26 68 26 54 39 39 52 13 17 12 19 13 21 rrcurveto + 10 17 6 17 17 3 -1 3 3 vvcurveto + 32 -3 -31 28 -35 hhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -28 -67 -14 -71 -47 callgsubr + rrcurveto + 5 8 10 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 391 221 rmoveto + -19 -4 -12 4 -4 13 -7 21 -14 7 -22 10 -9 3 -9 1 -8 1 rrcurveto + -1 hlineto + -78 -5 -60 -32 -43 -59 -43 -60 -35 -59 -27 -60 21 -2 rcurveline + 13 30 28 35 45 39 45 39 42 17 36 -7 rrcurveto + 1 vlineto + 24 1 21 -15 14 -30 46 callgsubr + 51 61 41 79 14 28 -2 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -9 -16 -15 rrcurveto + -61 -57 -59 -64 -60 -70 rrcurveto + 235 88 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -67 -15 -71 -13 27 27 0 1 27 27 18 18 22 15 23 13 29 16 39 -15 11 -20 rrcurveto + endchar + + + 261 188 rmoveto + 13 -22 9 -15 16 -9 23 -1 rlinecurve + 19 -2 22 6 24 14 rrcurveto + 1 3 8 6 5 hhcurveto + -4 1 3 -3 83 callgsubr + 12 hvcurveto + 32 40 13 67 7 67 -2 7 -2 -2 -1 -10 -12 -46 -31 -27 -49 -9 5 19 2 17 -1 17 rrcurveto + 5 -2 1 -3 -5 vhcurveto + -5 -19 -11 -19 -17 -18 -19 -20 -52 -24 -15 35 -5 11 -9 10 -14 8 -62 35 -58 -39 -34 -34 -58 -58 -52 -90 -35 -77 -8 -18 -6 -12 -2 -7 -2 -7 -2 -5 -1 -1 rrcurveto + 18 hlineto + 39 61 58 85 56 38 36 24 30 1 24 -21 rrcurveto + endchar + + + 358 173 rmoveto + -19 -4 -12 4 -4 13 rrcurveto + 29 -9 -24 14 -36 hhcurveto + -60 1 -49 -18 -39 -38 -39 -38 -33 -51 -26 -62 17 -23 rcurveline + 1 hlineto + 24 36 27 28 30 18 30 18 30 9 30 -1 27 -1 20 -16 12 -29 12 -30 63 16 31 9 52 14 51 20 52 25 81 39 51 60 41 79 14 28 -2 27 -21 25 rrcurveto + -17 20 -24 7 -31 -6 -31 -6 -23 -10 -16 -15 -64 -60 -60 -64 -57 -67 rrcurveto + 236 88 9 callgsubr + + + rmoveto + -14 32 -15 11 -19 -8 -19 -8 -14 -13 -10 -17 -19 -33 -19 -31 -21 -30 -21 -30 -26 -24 -31 -18 -41 -24 -37 -34 -18 -48 -10 -24 -11 -64 5 -37 3 -23 12 -16 22 -9 rrcurveto + 44 -18 62 0 55 9 162 25 129 59 97 86 29 26 31 25 11 45 -125 -71 -129 -57 -184 -11 -55 -3 -53 6 -50 17 rrcurveto + 4 3 4 7 4 vhcurveto + 56 30 46 50 36 70 14 26 17 23 32 8 29 -4 12 -29 2 -29 rrcurveto + -6 4 -2 6 4 vhcurveto + 6 4 3 4 2 4 17 41 -2 60 -11 44 rrcurveto + endchar + + + -27 callgsubr + endchar + + + 906 232 rmoveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -69 callgsubr + -123 92 -100 43 -47 76 -30 109 -14 47 -6 58 -1 71 3 156 6 142 43 101 68 56 38 35 51 16 63 rrcurveto + 8 29 5 40 -2 39 -20 405 rcurveline + -74 -117 5 -85 14 -261 1 -89 rlinecurve + return + + + 262 119 rmoveto + 13 29 9 22 7 21 2 3 1 20 -7 -10 -8 -21 -16 -17 -19 -11 -38 -21 -79 -10 -43 11 -26 7 -13 33 5 30 1 3 -3 1 -3 -4 -42 -57 -33 -107 67 -33 rrcurveto + 44 -22 76 26 39 16 -12 -41 98 14 71 15 102 22 101 44 64 86 34 45 45 59 -42 50 -34 40 -78 -20 -31 -29 -64 -60 -60 -65 -57 -66 -18 -4 -37 -7 -16 8 rrcurveto + 307 91 rmoveto + 4 -8 5 -14 -94 callgsubr + 40 -12 12 -22 rrcurveto + endchar + + + rmoveto + 34 49 25 56 12 58 33 5 49 10 40 10 87 22 90 51 53 71 34 45 45 59 -42 50 -34 40 -77 -20 -31 -29 rrcurveto + -110 -105 -71 -86 0 vvcurveto + -59 -13 3 32 -33 73 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 -64 -59 -124 -59 -93 33 -105 37 86 143 19 callgsubr + rrcurveto + 372 373 rmoveto + 4 -8 6 -13 -94 callgsubr + 39 -13 12 -22 rrcurveto + endchar + + + 103 414 rmoveto + 4 -2 3 -4 -3 -4 -3 -6 -3 vhcurveto + -59 -111 -28 -86 -58 vvcurveto + -96 41 -53 78 -7 vhcurveto + 38 -4 42 9 44 22 107 53 52 101 30 141 18 83 -15 66 -46 47 -11 11 -28 15 -16 -18 -31 -35 -17 -50 -22 -44 -13 -25 1 -20 14 -16 17 -19 43 -2 32 8 rrcurveto + 11 -17 4 -47 -28 vvcurveto + -39 -37 -79 -40 -69 -11 -66 -11 -69 18 -11 49 rrcurveto + -2 9 -1 10 10 vvcurveto + 12 2 13 3 13 vhcurveto + 10 41 32 57 15 35 rrcurveto + 2 6 2 4 4 vvcurveto + endchar + + + 251 499 rmoveto + 21 -321 74 118 -21 321 rlineto + 211 -408 rmoveto + 34 45 47 40 -42 50 -34 40 -77 -20 -31 -29 -64 -60 -60 -65 -57 -66 -76 -16 -78 3 -13 3 -29 7 -10 34 5 31 rrcurveto + 2 -2 1 -2 -3 vhcurveto + -42 -56 -34 -109 67 -33 rrcurveto + 28 -14 39 7 0 vvcurveto + 155 22 185 65 91 121 rrcurveto + -48 23 rmoveto + 4 -8 5 -14 -94 callgsubr + 40 -12 12 -22 rrcurveto + endchar + + + rmoveto + 7 22 4 18 14 vvcurveto + 23 -8 18 -20 -5 -5 -2 -2 -5 vhcurveto + -22 -9 -32 -33 -29 vvcurveto + -28 28 -15 19 -11 vhcurveto + -6 -6 -8 -7 -10 -7 -41 -29 -51 -32 -42 -27 rrcurveto + -7 -4 -2 -2 -1 vvcurveto + 6 1 81 20 55 27 43 58 rlinecurve + 7 -5 6 -1 5 -7 rrcurveto + 8 12 7 11 14 vvcurveto + 1 vlineto + -1 9 -5 5 -6 4 rrcurveto + -37 54 rmoveto + 3 hlineto + 12 5 -11 -14 -6 0 -6 -2 -8 hvcurveto + -10 5 -27 10 14 vvcurveto + 9 11 6 8 1 vhcurveto + endchar + + + 78 24 rmoveto + 157 -86 273 169 84 130 26 39 7 38 -25 27 -18 19 -33 -1 -28 8 -160 45 117 73 49 -15 20 32 11 39 17 36 rrcurveto + 9 4 -14 1 -4 hhcurveto + -35 -1 -28 -29 -19 -18 -42 -40 -83 -134 16 -56 15 -54 64 -20 67 -7 -60 -39 -69 -30 -83 -15 -69 -13 -90 2 -45 35 -103 81 104 151 39 81 4 8 -9 1 -3 -5 rrcurveto + -67 -94 -160 -272 173 -95 rrcurveto + return + + + rmoveto + -117 -92 -114 -220 30 -142 55 -261 425 67 163 198 4 4 -12 -3 -5 -1 -175 -46 -260 -38 -136 153 -78 88 247 210 55 48 40 35 65 42 14 36 45 116 rcurveline + -60 -58 -97 -59 -47 46 -32 27 -16 25 -8 49 40 -4 34 -7 60 callgsubr + -99 2 -58 -206 91 -113 9 -12 10 -11 11 -10 rrcurveto + endchar + + + 479 rmoveto + 22 -321 74 118 -22 321 rlineto + 212 -407 -14 callgsubr + + + 101 88 rmoveto + -1 vlineto + -1 -3 -15 -8 -29 -13 -29 -13 -16 -7 -4 -1 -7 -17 rcurveline + 98 -25 27 35 28 40 12 48 rlinecurve + 4 14 2 16 3 19 rrcurveto + 1 12 1 13 13 vvcurveto + 21 vlineto + -16 257 106 63 106 61 107 62 rlinecurve + 32 117 rlineto + 3 vlineto + 4 -1 1 -3 -2 -2 -1 -1 -3 vhcurveto + -107 -63 -109 -63 -107 -63 -32 -116 rcurveline + -61 -96 rlineto + 6 -96 11 -110 -102 vvcurveto + endchar + + + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -157 -2 -121 36 -91 callgsubr + 11 18 18 17 61 58 75 43 90 28 90 28 86 14 82 3 53 113 26 callgsubr + -115 -58 -79 -102 -79 -101 -26 -122 92 -100 64 -69 147 -32 162 4 129 3 121 26 98 42 55 23 44 return + + + 66 630 rmoveto + -5 -11 -6 -12 -5 -11 1 -6 2 -7 2 -5 14 -38 20 -33 2 -50 rrcurveto + -8 vlineto + -11 -1 -12 -2 -13 vhcurveto + -1 -1 0 0 vhcurveto + -1 1 -2 1 vhcurveto + 1 hlineto + 2 0 1 2 2 hvcurveto + 17 19 10 22 31 vvcurveto + 2 vlineto + 13 -2 12 -3 13 vhcurveto + -10 38 -18 35 -13 35 rrcurveto + 2 -1 -1 1 -2 hhcurveto + -1 hlineto + -3 -1 -1 -1 -3 vvcurveto + endchar + + + rmoveto + 40 -12 29 12 18 35 19 36 7 37 -3 39 rrcurveto + 3 -2 -1 -2 -4 vhcurveto + -2 -5 -1 -2 -1 vvcurveto + -28 -48 -34 -21 -41 5 -41 5 -31 27 -23 47 -13 -27 -12 -30 -10 -29 8 -19 9 -17 10 -15 32 -45 26 -44 25 -56 17 -36 7 -43 -5 -50 rrcurveto + -1 -2 8 7 0 vvcurveto + 25 39 11 42 -3 46 -4 46 -13 42 -22 39 rrcurveto + endchar + + + rmoveto + 34 45 46 39 -42 50 -34 40 -77 -20 -31 -29 -65 -61 -60 -65 -58 -67 -88 -15 -97 -8 -102 3 rrcurveto + -5 -4 -9 -3 5 hvcurveto + 74 -44 37 -39 65 -6 28 -3 33 4 44 11 131 34 99 53 67 90 rrcurveto + -49 22 rmoveto + 4 -8 5 -14 -94 callgsubr + 40 -12 12 -22 rrcurveto + endchar + + + 543 154 rmoveto + -80 -18 -77 -6 -73 5 -73 5 -71 32 -68 59 -27 23 -16 21 -2 19 -2 19 5 16 13 15 52 59 61 42 70 25 70 25 73 18 75 10 52 113 rcurveline + -79 -3 -79 -18 -80 -35 -80 -35 -67 -47 -53 -61 -35 -40 -24 -43 -15 -46 -37 -114 46 -76 71 -51 44 -32 65 -21 85 -11 return + + + 199 10 rmoveto + 15 27 2 37 8 32 32 123 34 117 50 103 rrcurveto + 48 5 46 7 41 vhcurveto + -3 1 -2 0 -1 -3 -50 -114 -47 -120 -36 -134 -36 117 -51 133 -58 121 -15 -47 -16 -48 -12 -44 65 -138 63 -136 30 -169 2 -8 11 10 3 5 rrcurveto + endchar + + + 106 382 rmoveto + -2 -1 -1 -57 callgsubr + -21 -20 vvcurveto + -56 21 -25 57 -8 vhcurveto + -3 21 24 -2 26 hhcurveto + 15 16 1 1 17 hvcurveto + 46 3 46 7 46 11 88 21 89 39 46 61 15 -190 rcurveline + 72 return + + + 196 165 rmoveto + -55 -17 -58 -12 -61 -7 -22 -129 rcurveline + 89 21 76 15 74 38 40 20 31 22 20 24 37 46 7 10 15 74 5 25 -13 13 -31 1 -31 1 -22 -102 callgsubr + -16 -18 -37 -17 hvcurveto + -17 -37 -12 -29 -9 -19 rrcurveto + endchar + + + 328 666 rmoveto + 28 -443 -64 -54 -95 -40 -111 20 rlinecurve + -107 46 88 134 31 69 9 24 -12 3 -8 -16 -256 -466 372 -28 146 211 rrcurveto + 49 71 30 84 85 vvcurveto + 0 -21 340 -5 78 vhcurveto + endchar + + + 156 496 rmoveto + 58 61 rlineto + 21 vlineto + -42 14 -21 25 39 vvcurveto + 5 48 13 47 callgsubr + -11 -38 -35 vvcurveto + -28 8 -25 14 -21 vhcurveto + -21 14 15 -11 14 hhcurveto + return + + + 116 770 rmoveto + -58 -61 rlineto + -21 vlineto + 42 -14 21 -25 -86 callgsubr + 22 19 38 23 hvcurveto + 23 38 12 38 -87 callgsubr + return + + + rmoveto + 1 -2 3 -2 -2 vhcurveto + -46 -40 -101 -27 -76 39 -10 5 2 3 -10 -5 -36 -18 -22 -20 -20 -35 -40 -70 55 68 19 11 9 5 11 11 12 -6 72 -37 92 25 49 32 rrcurveto + return + + + rmoveto + -41 -32 -51 -77 8 hvcurveto + 7 -72 28 -95 33 -94 31 -30 rcurveline + -2 10 -9 37 -17 64 -23 85 -8 172 103 -99 rrcurveto + 7 -7 8 6 8 vvcurveto + 91 -4 -29 52 -60 hhcurveto + endchar + + + -3 callgsubr + 72 return + + + -69 -35 -58 -35 -46 -37 rlinecurve + -46 -37 -35 -57 -24 -77 rrcurveto + -11 -3 0 -6 5 hhcurveto + 5 4 2 5 3 hvcurveto + 38 60 35 39 32 19 32 19 57 24 80 27 31 -349 rcurveline + return + + + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -24 -103 callgsubr + -21 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + return + + + -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + -81 callgsubr + 6 -17 13 11 19 40 29 58 23 56 15 36 return + + + 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -64 callgsubr + return + + + -35 -72 rrcurveto + -34 -3 -32 -5 -28 vhcurveto + 2 -1 1 0 1 2 35 80 33 84 25 94 25 -82 37 -93 40 -85 11 33 10 34 9 30 rrcurveto + endchar + + + 12 24 15 34 8 25 rrcurveto + 2 5 1 4 3 vvcurveto + 2 0 1 -2 vhcurveto + -2 hlineto + -75 callgsubr + -22 -11 -26 -6 -31 -1 -31 27 return + + + -91 callgsubr + 11 18 18 18 61 58 75 42 90 28 -42 callgsubr + -79 -3 -72 return + + + -64 -59 -99 -47 -118 21 -107 46 88 134 19 callgsubr + return + + + 66 callgsubr + vhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 return + + + 4 -22 6 rrcurveto + -1 hlineto + -18 -38 -20 -35 -16 -93 callgsubr + 13 -3 22 -2 30 -1 30 -1 27 -3 21 -5 return + + + -9 -18 rcurveline + 4 30 rlineto + -81 callgsubr + 8 -23 15 29 18 35 return + + + 11 callgsubr + 5 11 2 6 1 3 return + + + -99 callgsubr + -92 callgsubr + 37 34 39 47 26 29 16 40 -17 11 -19 rrcurveto + endchar + + + 3 3 hvcurveto + 15 17 14 18 -100 callgsubr + rrcurveto + 3 7 6 2 6 hhcurveto + 20 return + + + 7 rmoveto + 49 -6 57 -2 65 3 143 6 130 36 97 58 53 32 39 42 25 51 return + + + 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -23 -11 -16 -14 rrcurveto + -64 -60 -60 return + + + -27 10 -34 16 -40 22 -75 42 -41 -24 -36 -52 -16 -24 -7 -12 2 -1 rrcurveto + -49 -58 -44 return + + + -114 -57 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 rrcurveto + endchar + + + rmoveto + -46 97 -44 94 -21 119 -1 5 -8 -6 -2 -3 -11 -19 -1 -27 -6 -22 -22 return + + + -103 callgsubr + -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + return + + + -99 callgsubr + -8 -8 -4 -57 -28 -67 -14 -71 -47 callgsubr + 29 return + + + 27 17 30 17 30 -2 28 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 return + + + 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 return + + + 73 callgsubr + 52 74 11 21 77 47 rlinecurve + 1 return + + + 44 callgsubr + rrcurveto + -22 -11 -27 return + + + -42 callgsubr + -79 -3 -72 -9 -64 -17 -143 return + + + 32 27 24 rlinecurve + 8 9 9 4 10 hhcurveto + 9 10 -3 -8 10 hvcurveto + 14 -11 return + + + -22 -7 -48 -16 -50 -53 -28 -38 -25 -34 -31 -32 -14 -43 rrcurveto + -3 -10 24 return + + + -39 13 -9 9 -7 7 2 91 callgsubr + endchar + + + rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 return + + + -10 42 130 rcurveline + -32 8 -28 8 -37 1 -52 1 -34 -66 -15 -44 return + + + -4 -1 -1 -44 callgsubr + -4 6 -3 vhcurveto + 138 -62 rlineto + -18 return + + + 3 vhcurveto + 11 24 13 70 callgsubr + 13 return + + + rmoveto + 34 -3 35 -7 36 65 callgsubr + return + + + 11 rrcurveto + 13 -6 24 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -25 -12 -24 return + + + -40 callgsubr + 5 6 vvcurveto + 35 -31 12 -41 1 vhcurveto + endchar + + + rmoveto + 13 -5 10 -14 9 -24 9 -24 -3 -16 -16 -7 -25 -12 -24 return + + + -99 callgsubr + -8 -8 -4 -57 -27 -68 -15 -70 -14 36 37 35 return + + + -33 -45 -27 -37 -19 -45 -22 -41 -10 -19 -1 -34 19 -9 32 -16 return + + + -17 -39 48 callgsubr + vhcurveto + return + + + -8 -21 -1 rrcurveto + -9 5 -14 12 15 vvcurveto + 305 13 rmoveto + -4 return + + + 2 -9 -5 rlinecurve + -110 -64 -87 -47 -110 -64 -22 -81 rcurveline + return + + + rmoveto + 7 -14 0 -92 callgsubr + 37 return + + + 8 -37 1 -52 1 -33 -66 -15 -44 -17 -52 -10 -75 28 -43 return + + + -33 -21 -53 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -15 -18 -4 return + + + 29 40 26 42 18 51 53 -21 -2 4 45 -28 rrcurveto + endchar + + + 61 -14 55 -9 55 -7 45 -14 28 -18 13 -18 13 -21 return + + + 8 53 callgsubr + return + + + 11 26 17 26 17 21 23 19 29 51 79 rcurveline + 8 12 return + + + 14 -30 60 15 32 9 52 14 51 20 52 25 81 39 return + + + 31 24 14 rrcurveto + 21 vlineto + -22 -23 -19 -38 -23 hvcurveto + -23 -38 return + + + rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 return + + + rrcurveto + 16 35 8 36 37 vvcurveto + 37 -14 35 -30 31 vhcurveto + return + + + -3 vhcurveto + 94 callgsubr + -81 rcurveline + return + + + rmoveto + 13 -5 10 -15 9 -24 9 -24 -3 -16 -16 -7 return + + + hhcurveto + 29 58 31 17 13 hvcurveto + 33 42 11 65 7 68 return + + + 25 4 12 0 5 -5 -2 -75 callgsubr + return + + + -36 -51 -16 -23 -8 -12 2 -1 rrcurveto + -49 -59 -43 -75 return + + + -9 22 vhcurveto + -11 27 -77 -113 rlineto + 10 -29 21 return + + + 58 34 48 47 39 59 23 35 13 35 2 34 return + + + -1 -3 -8 hvcurveto + -48 -16 -49 -53 -29 -38 -25 -34 return + + + -57 -67 -18 -4 -22 -6 -19 7 rrcurveto + 15 -12 -9 return + + + 93 callgsubr + 6 12 3 return + + + 31 -10 42 130 rcurveline + -33 8 -29 8 -35 1 return + + + -30 6 -17 6 -17 13 12 19 40 1 2 1 return + + + 36 -91 callgsubr + 11 return + + + -3 -41 1 -30 6 -17 rlinecurve + return + + + 4 14 8 15 4 15 36 return + + + -11 42 130 rcurveline + -32 7 -28 9 -37 1 return + + + rrcurveto + 6 11 3 12 11 vvcurveto + 36 -33 33 -38 return + + + 83 callgsubr + 13 hvcurveto + 33 42 12 return + + + rmoveto + 28 -425 74 118 -28 425 rlineto + return + + + 11 13 hvcurveto + 1 1 1 1 1 hhcurveto + 5 6 return + + + 16 17 6 rrcurveto + 1 3 2 0 2 hhcurveto + 13 return + + + -40 22 -40 22 -33 5 -27 -13 -18 -9 -17 return + + + -30 -32 -15 -43 rrcurveto + -3 -10 24 6 3 3 return + + + -24 -37 -16 -28 -7 -19 46 -32 rcurveline + 1 1 return + + + -80 vvcurveto + -11 0 -11 -1 -11 vhcurveto + -33 -21 -41 return + + + 21 15 20 18 24 return + + + -12 -23 -20 hvcurveto + -47 -54 -40 -67 -33 -81 return + + + rrcurveto + -1 vlineto + -10 -12 -5 -10 -9 vvcurveto + -10 return + + + rmoveto + -18 -14 -22 -12 -28 -8 -3 -1 -4 return + + + 79 rcurveline + 7 12 7 15 7 19 15 45 return + + + -40 -5 -11 0 -7 6 -1 57 -12 53 return + + + -22 -41 rrcurveto + -5 -9 -2 -11 -12 vvcurveto + -27 return + + + 1 2 1 2 1 2 return + + + 5 hhcurveto + 29 58 32 17 return + + + 14 35 11 32 27 24 return + + + -30 6 -17 rlinecurve + 6 -17 return + + + -14 -40 0 -41 15 -40 8 -22 15 return + + + -12 -26 -14 -32 -16 -36 21 -2 rcurveline + return + + + -2 -3 vhcurveto + -8 -14 -4 -20 -13 -10 return + + + 2 -29 6 -17 6 -17 13 11 19 return + + + -57 -27 -68 -14 -70 -14 36 37 34 return + + + 6 12 35 75 32 78 27 82 rrcurveto + return + + + 73 -32 27 -15 24 2 20 2 20 return + + + -50 -9 18 35 16 31 14 29 rrcurveto + return + + + -110 -64 -86 -47 -110 -64 -23 return + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/merge/data/CFFFont2.ttx b/Tests/merge/data/CFFFont2.ttx new file mode 100644 index 00000000..0c0c6b2b --- /dev/null +++ b/Tests/merge/data/CFFFont2.ttx @@ -0,0 +1,6682 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copyright (c) 1997, 2009, 2011 American Mathematical Society (<http://www.ams.org>), with Reserved Font Name EURM10. + + + Euler Text + + + Regular + + + 1.000;ALIF;EulerText-Regular + + + Euler Text Regular + + + Version 1.000 + + + EulerText-Regular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -89 callsubr + -202 hmoveto + -48 callsubr + return + + + rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + return + + + rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + return + + + rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + return + + + rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + return + + + rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -47 callsubr + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + -49 callsubr + 160 -15 83 rrcurveto + -194 -65 callsubr + -206 586 -58 callsubr + + + -41 callsubr + 54 -54 -79 22 -75 -39 callsubr + vhcurveto + 51 678 rmoveto + 169 61 -182 -142 -150 -62 -163 -166 -39 -61 10 67 -60 hvcurveto + -23 callsubr + endchar + + + rmoveto + 44 49 14 66 65 vvcurveto + 112 -51 114 -147 -79 callsubr + vhcurveto + -34 callsubr + -163 367 rmoveto + -42 callsubr + 74 18 54 36 54 hhcurveto + endchar + + + rmoveto + 44 -17 35 -45 -39 -56 -39 -36 -45 vhcurveto + 13 -18 rlineto + 15 24 34 17 22 hhcurveto + 26 9 -33 -52 hvcurveto + -6 -221 rlineto + -99 37 -13 43 55 52 52 45 34 vhcurveto + 11 vlineto + -13 10 rlineto + -24 -27 -27 -21 -38 hhcurveto + -35 -9 43 74 hvcurveto + endchar + + + hlineto + -7 -40 rlineto + return + + + -62 callsubr + -148 -1 -7 -7 1 -20 47 -7 23 -12 6 -13 rlinecurve + 9 -20 0 -30 -14 vvcurveto + -492 vlineto + -27 6 -28 20 -11 vhcurveto + 388 -82 callsubr + endchar + + + rmoveto + -7 6 rlineto + -169 hlineto + -8 -7 2 -20 rlineto + 14 74 -12 -40 hvcurveto + -59 vlineto + -78 -2 -79 -77 vvcurveto + -61 1 -74 7 -46 vhcurveto + -59 12 33 -77 139 hhcurveto + 83 80 34 45 70 hvcurveto + 8 -6 rlineto + -30 -6 -39 39 31 71 21 16 51 vhcurveto + 5 7 -4 17 rlineto + -2 -20 -18 -6 -20 hhcurveto + -48 0 72 82 162 1 209 15 114 hvcurveto + -6 7 -88 -35 rlineto + -2 -182 -2 -183 -183 vvcurveto + -32 -54 -60 -27 -62 hhcurveto + -97 -79 49 168 hvcurveto + 8 273 rlineto + 17 5 101 3 14 vhcurveto + endchar + + + rmoveto + -19 -26 -34 -23 -27 hhcurveto + -49 0 55 61 92 4 93 8 93 hvcurveto + -13 11 -77 -35 rlineto + 1 -21 0 -39 -46 -71 -1 -89 -65 vvcurveto + -24 -39 -47 -29 -45 hhcurveto + -92 2 91 102 169 9 55 -75 -42 -55 -43 -30 -39 hvcurveto + 13 -20 rlineto + 13 23 34 17 14 hhcurveto + 12 10 -2 -7 6 hvcurveto + 13 -14 4 -16 -91 -29 -4 -101 -33 vvcurveto + -56 19 -66 86 59 73 41 34 56 vhcurveto + 8 -1 rlineto + -42 4 19 -30 46 hhcurveto + 51 63 53 41 47 hvcurveto + -11 19 rlineto + endchar + + + rmoveto + 77 -56 61 -86 -76 -72 -33 -57 -49 vhcurveto + -39 -45 -12 -59 -58 vvcurveto + -113 32 -125 134 86 80 58 58 62 vhcurveto + -31 callsubr + 282 122 rlineto + 11 5 10 4 12 vvcurveto + -177 98 rmoveto + -45 callsubr + 26 21 30 16 33 hhcurveto + endchar + + + vlineto + 40 8 rlineto + return + + + rmoveto + -1 -43 11 6 -21 hvcurveto + -42 11 11 75 -1 43 rrcurveto + -1 61 -1 62 67 vvcurveto + 78 -6 119 9 59 vhcurveto + 1 12 8 11 13 3 67 15 rcurveline + 21 vlineto + -6 -80 callsubr + -22 vlineto + 80 -18 7 5 2 -30 rrcurveto + 3 -38 0 -38 -39 vvcurveto + -363 vlineto + -4 -83 13 -7 -98 -19 rrcurveto + -26 265 vlineto + endchar + + + 704 rmoveto + -11 -1 -433 -680 rlineto + -14 vlineto + 31 -13 437 688 -3 11 rlineto + return + + + rmoveto + -48 callsubr + return + + + rmoveto + -30 callsubr + return + + + 885 -104 callsubr + return + + + hlineto + -4 6 rlineto + return + + + rmoveto + -28 27 53 -23 47 hhcurveto + 107 103 54 130 36 hvcurveto + 22 95 -15 212 14 204 -12 4 rcurveline + -79 -38 rlineto + 5 -69 3 -72 -72 vvcurveto + -36 -1 -36 -1 -35 vhcurveto + -22 -37 -49 -30 -48 hhcurveto + -24 -24 7 19 -15 hvcurveto + -16 21 -9 30 -3 93 rrcurveto + 58 4 58 56 vvcurveto + 37 -20 33 -43 -46 -79 -57 -10 -14 vhcurveto + 11 -19 rlineto + 12 23 31 16 17 hhcurveto + 41 5 -44 -72 hvcurveto + -50 -4 -42 -45 vvcurveto + -67 7 -98 97 64 68 42 35 56 vhcurveto + 6 -5 -1 -32 -1 -33 -6 -33 rlinecurve + -57 -10 -24 -101 -107 hhcurveto + -45 -38 39 38 -21 hvcurveto + -13 hlineto + -44 -56 rlineto + endchar + + + -85 -17 -36 -57 -84 -145 -8 -14 rlinecurve + -54 -30 -35 -53 -5 hhcurveto + -6 -5 6 2 -1 hvcurveto + -141 325 rlineto + -145 hlineto + -7 -7 rlineto + -28 vlineto + 40 -6 23 -6 23 -45 return + + + 575 -52 callsubr + endchar + + + hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + return + + + hlineto + 6 -8 rlineto + -108 vlineto + -91 -6 -94 -7 -99 vhcurveto + 17 -11 79 24 rlineto + -7 81 -3 95 94 vvcurveto + 111 vlineto + 6 6 rlineto + return + + + 6 rlineto + -250 hlineto + -7 -6 rlineto + return + + + -70 -71 -22 -52 -47 return + + + hvcurveto + -8 6 rlineto + 37 return + + + rmoveto + 21 -304 3 -99 -102 vvcurveto + -2 -1 -6 -5 -4 -4 5 3 -3 vhcurveto + -117 126 -162 215 -133 176 rrcurveto + -162 hlineto + -8 -7 4 -27 rlineto + 95 -23 -10 -4 -21 -43 1 -43 -43 vvcurveto + -158 -5 -159 -8 -158 vhcurveto + 9 -9 70 30 rlineto + -11 174 -13 219 129 vvcurveto + 5 0 12 7 4 4 -5 -4 3 vhcurveto + 49 -56 83 -95 102 -126 159 -198 rcurveline + 30 -38 14 -16 23 -26 rrcurveto + 36 hlineto + 227 2 232 13 227 vhcurveto + -6 8 rlineto + endchar + + + rmoveto + 7 vlineto + 40 22 44 38 43 vvcurveto + 50 -49 33 -68 vhcurveto + -6 hlineto + -54 -19 -58 -27 -60 vvcurveto + -43 38 -34 38 -23 vhcurveto + -7 vlineto + -72 -37 -37 -24 -56 vvcurveto + -27 6 -27 22 -19 vhcurveto + -21 23 38 -6 32 hhcurveto + 81 83 47 77 49 -30 20 -71 44 hvcurveto + -22 16 rmoveto + -36 22 -41 33 35 vvcurveto + 23 8 17 31 18 vhcurveto + 58 29 -39 -30 -32 -20 -30 -29 -17 hvcurveto + -28 -47 rmoveto + 55 -31 37 -24 -44 vvcurveto + -49 -33 -33 -54 -53 -30 44 43 47 32 25 46 22 vhcurveto + endchar + + + 263 697 -73 callsubr + + + rmoveto + -206 -260 rlineto + -27 204 vlineto + 5 -5 rlineto + -38 1 -50 -4 -21 vhcurveto + 3 -3 58 20 rlineto + -2 13 -1 48 32 vvcurveto + 6 4 rlineto + 59 hlineto + 12 23 -3 4 rlineto + -68 hlineto + -6 5 rlineto + 93 1 164 1 16 vhcurveto + -6 3 rlineto + -55 -281 rmoveto + -155 hlineto + -3 4 1 13 60 83 27 35 rlinecurve + 21 27 21 28 25 23 rrcurveto + 1 1 1 1 2 hhcurveto + 2 1 -1 -4 hvcurveto + -205 vlineto + endchar + + + rmoveto + -51 -21 -194 -260 rlineto + -26 192 vlineto + 5 -6 rlineto + -38 1 -49 -4 -21 vhcurveto + 3 -4 54 20 rlineto + -2 13 1 48 32 vvcurveto + 4 5 rlineto + 56 hlineto + 11 22 -3 4 rlineto + -64 hlineto + -4 5 rlineto + 93 -1 164 1 16 vhcurveto + -53 -273 rmoveto + -4 -5 rlineto + -146 hlineto + -3 4 rlineto + 13 57 84 26 35 vhcurveto + 20 27 20 28 23 23 rrcurveto + 1 1 2 0 1 hhcurveto + 2 1 -1 -4 hvcurveto + endchar + + + rmoveto + 10 50 46 58 36 47 rrcurveto + 36 46 40 59 50 vvcurveto + 65 -49 39 -98 vhcurveto + -34 -13 -60 -27 -19 -22 rrcurveto + -19 -22 -7 -27 -31 vvcurveto + -58 58 -42 46 35 34 10 16 32 vhcurveto + 5 -3 rlineto + -22 -33 -58 -69 0 vvcurveto + -30 -35 -33 -38 -14 -28 7 -4 rcurveline + 151 235 rmoveto + -14 -16 -25 -5 -22 hhcurveto + -57 -31 51 47 31 23 46 38 73 38 -46 -51 -21 -4 -23 -17 -15 hvcurveto + endchar + + + rmoveto + 4 -10 -17 3 -10 hhcurveto + -61 -57 -35 -39 -43 hvcurveto + -60 -55 -31 -72 -76 vvcurveto + -69 34 -82 96 81 78 64 71 51 -41 48 -61 -47 -42 -17 -26 -36 vhcurveto + -5 1 1 58 13 60 53 44 rlinecurve + 23 28 37 16 41 hhcurveto + 14 12 -2 -5 13 hvcurveto + 7 2 rlineto + -217 -221 rmoveto + 13 15 41 16 28 hhcurveto + 54 38 -41 -44 -47 -31 -37 -56 -70 -19 82 58 hvcurveto + endchar + + + rmoveto + 59 15 48 39 58 vvcurveto + 53 -46 27 -53 -42 -46 -30 -26 -35 vhcurveto + 10 -13 rlineto + 15 26 31 16 26 hhcurveto + 41 32 -22 -37 -55 -48 -29 -81 -17 hvcurveto + -1 -16 rlineto + 41 54 -2 -25 26 hvcurveto + 20 -19 13 -23 -26 vvcurveto + -53 -39 -45 -60 -41 -29 27 32 -22 vhcurveto + -7 hlineto + -28 -44 4 -6 rlineto + -21 31 37 -12 39 hhcurveto + 89 90 56 83 62 -56 26 -83 7 hvcurveto + endchar + + + rmoveto + 4 5 2 4 32 86 2 1 59 vhcurveto + 18 47 rlineto + -227 hlineto + -5 -4 rlineto + -196 vlineto + 8 -7 rlineto + 19 22 28 13 30 hhcurveto + 69 25 -53 -50 -62 -36 -56 -76 -41 -26 34 29 -14 hvcurveto + -8 hlineto + -29 -33 1 -8 rlineto + -29 28 40 -16 43 hhcurveto + 97 86 65 93 67 -50 48 -79 -31 -31 -10 -12 -28 hvcurveto + endchar + + + 45 437 rmoveto + -150 121 -121 150 150 121 121 150 150 -121 121 -150 -150 -121 -121 -150 vhcurveto + 25 hmoveto + 136 110 110 136 136 110 -13 callsubr + -13 callsubr + 110 136 vhcurveto + return + + + rmoveto + -29 -10 -34 -15 -22 -20 rrcurveto + -58 -51 -31 -72 -72 vvcurveto + -71 21 -119 97 122 50 123 99 79 -33 84 -83 45 vhcurveto + -38 -38 rmoveto + 31 -11 30 -42 4 -8 rrcurveto + 30 -47 17 -51 -54 vvcurveto + -59 -18 -81 -81 -45 -30 48 40 -14 vhcurveto + -11 33 -3 36 35 vvcurveto + 60 31 67 59 34 vhcurveto + endchar + + + rmoveto + -3 5 rlineto + -209 hlineto + -4 -5 0 4 1 0 0 1 1 hvcurveto + 82 83 107 106 84 vvcurveto + 53 -44 40 -58 -56 -50 -32 -36 -37 vhcurveto + 13 -11 rlineto + 19 26 31 19 37 hhcurveto + 56 20 -46 -33 -72 -53 -60 -53 -55 hvcurveto + -36 -37 -38 -35 -38 -35 rrcurveto + -10 296 vlineto + endchar + + + -27 hlineto + 90 -28 callsubr + -115 -204 -36 callsubr + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + return + + + rmoveto + 13 25 35 20 16 hhcurveto + 36 8 -12 -242 -44 -3 -124 -17 -62 hvcurveto + -14 -50 -40 -45 -74 -44 16 -16 rcurveline + 90 43 76 60 30 87 rrcurveto + 12 35 0 140 20 vvcurveto + 37 0 167 -7 43 vhcurveto + 33 -3 -10 34 -48 hhcurveto + -43 -57 -43 -32 -41 hvcurveto + endchar + + + hhcurveto + 86 80 58 58 62 hvcurveto + -31 callsubr + 42 199 rmoveto + 26 21 30 16 33 hhcurveto + -45 callsubr + return + + + rmoveto + -61 callsubr + return + + + -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + return + + + rmoveto + 8 -140 vlineto + -31 -103 0 4 -13 hvcurveto + -14 -47 4 -5 rlineto + 228 hlineto + 5 -8 rlineto + -42 -59 -66 -103 0 vvcurveto + -37 -55 -58 -90 -16 -49 4 -5 rcurveline + 56 12 22 88 44 81 53 77 rlinecurve + endchar + + + -38 -44 -50 -31 -59 hhcurveto + -117 -24 115 86 88 45 100 85 43 33 -39 -67 9 hvcurveto + 17 -6 -14 callsubr + -148 -105 -108 -150 -99 10 -137 163 return + + + rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 -27 callsubr + 1 3 3 3 vhcurveto + endchar + + + -55 callsubr + 20 47 rcurveline + -36 hlineto + endchar + + + 2 rmoveto + 104 131 16 73 67 hvcurveto + 77 83 22 84 127 vvcurveto + 177 -57 124 -310 vhcurveto + -313 hlineto + -7 -8 rlineto + -19 vlineto + 26 -8 47 -6 2 -25 rrcurveto + 1 -15 1 -16 -16 vvcurveto + return + + + -112 -53 callsubr + return + + + rmoveto + -146 -44 rlineto + -16 56 vlineto + 42 -10 -49 -67 -84 -2 -84 -3 -83 hvcurveto + 8 -3 57 16 rlineto + -2 46 0 118 82 vvcurveto + 53 1 55 4 53 vhcurveto + endchar + + + rmoveto + 37 -11 50 -31 -28 -38 -14 -18 -32 -14 -26 -10 -5 -10 rcurveline + 6 -15 55 10 70 18 33 44 rlinecurve + 26 36 -9 36 -23 28 -19 23 -40 18 -13 5 return + + + -32 callsubr + 30 hmoveto + -29 callsubr + return + + + -36 rmoveto + -16 60 vlineto + 44 -10 -49 -67 -84 -1 -85 -4 -83 hvcurveto + 8 -3 61 17 rlineto + -2 46 -1 118 82 vvcurveto + 53 2 54 4 53 vhcurveto + -5 8 rlineto + return + + + hhcurveto + -44 -52 -36 -32 -40 hvcurveto + 14 -19 rlineto + 14 24 28 15 21 hhcurveto + 30 9 -52 -45 hvcurveto + -221 vlineto + -57 -1 -205 -5 -58 vhcurveto + 10 -11 rlineto + 73 return + + + rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 return + + + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + return + + + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + return + + + hlineto + -7 -7 rlineto + -18 vlineto + 38 -5 33 -9 3 -40 rrcurveto + 3 -59 2 -59 -59 vvcurveto + -141 -5 -141 -2 -140 vhcurveto + 7 -7 return + + + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + return + + + vvcurveto + 19 65 -2 29 2 vhcurveto + 65 5 73 15 44 45 rrcurveto + 42 42 22 55 59 vvcurveto + 106 -67 59 -164 vhcurveto + return + + + 6 vvcurveto + 37 47 41 21 51 hhcurveto + 64 39 -77 -87 -95 -34 -115 -121 -33 -31 15 22 -24 hvcurveto + endchar + + + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + return + + + rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + return + + + rmoveto + -85 -43 -83 -71 -92 vvcurveto + -71 44 -77 88 91 94 101 90 76 -73 67 -76 20 vhcurveto + return + + + -22 callsubr + -165 74 -171 205 return + + + -66 -139 -4 -7 3 9 87 2 113 4 88 hvcurveto + 5 2 6 7 vhcurveto + endchar + + + rmoveto + 210 202 -192 188 -31 -46 149 -146 -150 -170 rlineto + return + + + -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + return + + + rmoveto + -37 30 -30 37 37 30 30 37 37 -30 30 -37 -37 -30 -30 -37 vhcurveto + endchar + + + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + return + + + rmoveto + -18 callsubr + -192 -188 rlineto + return + + + rmoveto + -54 43 -43 54 54 43 43 54 54 -43 43 -54 -54 -43 -43 -54 vhcurveto + return + + + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + return + + + -31 26 -26 32 31 25 26 31 31 -25 26 -31 -32 -26 -26 -31 vhcurveto + return + + + 37 30 30 37 37 30 -30 -37 -37 -30 -30 -37 -37 -30 30 37 vhcurveto + return + + + -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 return + + + hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + return + + + 586 rmoveto + -40 -6 rlineto + -304 -303 vlineto + -7 -40 rlineto + 310 return + + + -63 -60 -37 -70 -30 hvcurveto + -16 -36 -2 -51 -35 vvcurveto + -6 -6 rlineto + return + + + hlineto + 52 186 -7 10 -22 2 -11 -3 -54 -195 rlineto + return + + + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + return + + + hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + return + + + 595 -17 callsubr + + + 319 rmoveto + 11 5 10 4 12 vvcurveto + 77 -56 61 -86 return + + + hlineto + -54 -195 4 -14 33 -3 59 212 rlineto + return + + + 14 28 -150 170 149 146 -31 46 return + + + rmoveto + -235 -97 callsubr + 236 hlineto + endchar + + + rmoveto + -657 -97 callsubr + 658 hlineto + return + + + rmoveto + -661 -97 callsubr + 662 hlineto + return + + + 54 53 rlineto + 57 -6 -45 41 -65 hhcurveto + return + + + -110 -136 -136 -110 return + + + + + + -45 50 -200 rmoveto + 400 1000 -400 -1000 hlineto + 50 50 rmoveto + 900 300 -900 -300 vlineto + endchar + + + 177 572 -10 -101 callsubr + + + 252 366 66 rmoveto + -27 6 -28 20 -11 vhcurveto + 388 -82 callsubr + 6 48 -61 callsubr + -194 -27 hlineto + 91 -28 callsubr + -116 -206 -36 callsubr + 142 hlineto + 39 vmoveto + -116 -27 callsubr + 2 5 4 0 -9 vvcurveto + endchar + + + 177 517 882 -104 callsubr + 217 -738 -101 callsubr + + + 177 189 729 -106 callsubr + 214 -920 -101 callsubr + + + 177 512 813 -107 callsubr + 262 -823 -101 callsubr + + + 177 222 883 -105 callsubr + 303 -929 -101 callsubr + + + 177 572 -10 -49 callsubr + 159 -15 83 rrcurveto + 21 18 13 26 30 vvcurveto + 54 -43 43 -54 -54 -43 -43 -54 -29 13 -26 20 -18 vhcurveto + -67 -65 callsubr + -267 763 rmoveto + -29 callsubr + 61 -177 -58 callsubr + + + 177 350 838 -103 callsubr + 175 -827 -101 callsubr + + + 14 335 378 rmoveto + 81 34 72 44 97 vvcurveto + 109 -116 24 -113 vhcurveto + -247 hlineto + -7 -7 -1 -17 rlineto + 37 -10 46 -7 -34 vvcurveto + -530 vlineto + -56 -3 16 -20 -30 vhcurveto + 1 -10 rlineto + 1 131 -2 66 hhcurveto + 121 144 48 154 98 -48 52 -146 19 hvcurveto + -165 259 rmoveto + 21 6 44 -2 23 hhcurveto + 85 76 -19 -84 -118 -94 -46 -106 -20 -12 0 10 -2 hvcurveto + -53 vmoveto + 10 5 21 -2 36 hhcurveto + 100 106 -19 -119 -117 -91 -52 -102 -67 -8 4 23 hvcurveto + endchar + + + 88 624 586 rmoveto + 85 -52 -76 28 -88 hhcurveto + -104 -101 -36 -73 -73 hvcurveto + -70 -70 -21 -98 -96 vvcurveto + -98 26 -99 70 -70 vhcurveto + -57 57 82 -17 79 hhcurveto + 87 80 42 49 72 hvcurveto + -17 29 rlineto + -38 -56 -63 -29 -68 hhcurveto + -82 -42 28 55 -55 hvcurveto + -33 33 -48 98 92 vvcurveto + 152 64 162 182 82 63 -39 -90 34 vhcurveto + 14 -1 rlineto + endchar + + + 88 285 -55 callsubr + 11 26 rcurveline + 83 4 76 40 69 47 -17 29 rcurveline + -38 -56 -63 -29 -68 hhcurveto + -82 -42 28 55 -55 hvcurveto + -33 33 -48 98 92 vvcurveto + 152 64 162 182 82 63 -39 -90 34 vhcurveto + 14 -1 57 58 rlineto + 85 -52 -76 28 -88 hhcurveto + -104 -101 -36 -73 -73 hvcurveto + -70 -70 -21 -98 -96 vvcurveto + -98 26 -99 70 -70 vhcurveto + 51 -51 71 -19 71 -3 rrcurveto + endchar + + + 192 295 -56 callsubr + -494 vlineto + -1 -38 -1 -14 -20 -15 rrcurveto + -10 vlineto + 106 573 rmoveto + 71 4 -10 10 5 vhcurveto + 3 6 17 1 43 hhcurveto + 131 100 -7 -47 48 hvcurveto + 56 -56 17 -97 -61 vvcurveto + -168 -65 -169 -270 -27 -39 0 13 -13 vhcurveto + -15 15 -2 62 -1 40 rrcurveto + endchar + + + 206 46 45 rmoveto + 2 -42 rlineto + 5 73 74 2 74 hhcurveto + 125 124 -6 -8 125 hvcurveto + 61 32 1 16 -108 209 -86 219 -74 224 rlinecurve + -58 -25 rlineto + 199 -621 rmoveto + -117 -118 3 -118 hhcurveto + -35 -35 0 -1 -35 hvcurveto + -3 12 80 169 80 157 95 164 rlinecurve + 11 hlineto + -1 160 -400 41 -94 vhcurveto + endchar + + + -27 417 384 -96 callsubr + + + -27 385 -87 callsubr + 194 -347 -96 callsubr + + + -27 107 732 -106 callsubr + 141 -529 -96 callsubr + + + -27 430 816 -107 callsubr + 189 -432 -96 callsubr + + + -27 140 886 -105 callsubr + 230 -538 -96 callsubr + + + 201 304 -56 callsubr + -193 -69 vlineto + -7 -40 rlineto + 76 -261 hlineto + -1 -38 -1 -14 -20 -15 rrcurveto + -10 vlineto + 247 378 rmoveto + -141 195 hlineto + 71 4 -10 10 5 vhcurveto + 3 6 17 1 43 hhcurveto + 131 100 -7 -47 48 hvcurveto + 56 -56 17 -97 -61 vvcurveto + -168 -65 -169 -270 -27 -39 0 13 -13 vhcurveto + -15 15 -2 62 -1 40 rrcurveto + 170 135 vlineto + endchar + + + -104 87 360 rmoveto + -121 -3 -120 -4 -121 vhcurveto + 92 15 rlineto + -4 101 -1 115 101 vvcurveto + 7 7 4 5 71 88 -1 -4 70 vhcurveto + 5 5 1 49 rlineto + -3 -72 -90 -9 -73 hhcurveto + -9 -4 8 5 211 3 10 4 14 hvcurveto + 17 5 14 6 13 hhcurveto + 72 72 -15 -5 72 hvcurveto + 8 8 rlineto + 53 vlineto + -2 -73 -206 0 -142 hhcurveto + -7 -7 rlineto + -21 vlineto + 55 -13 rlineto + 40 -10 -7 -73 -43 vvcurveto + endchar + + + 116 325 270 rmoveto + 6 -5 54 -2 64 -3 44 -4 rlinecurve + 38 -4 -10 -98 -20 vvcurveto + -30 6 -54 -26 -5 vhcurveto + -7 -31 -31 -3 -32 hhcurveto + -196 -82 159 146 152 55 158 187 81 59 -32 -88 44 hvcurveto + 12 -1 58 57 rlineto + 81 -53 -69 32 -87 hhcurveto + -105 -105 -31 -75 -75 hvcurveto + -70 -70 -22 -101 -98 vvcurveto + -95 25 -98 68 -68 vhcurveto + -54 54 75 -26 76 hhcurveto + 73 108 27 23 88 hvcurveto + 1 -3 182 -2 91 vhcurveto + -276 -11 rlineto + endchar + + + -53 464 697 rmoveto + -3 -60 -61 -1 -61 hhcurveto + -237 hlineto + -3 -20 26 -22 rlineto + 21 -18 -5 -50 -30 vvcurveto + -92 -4 -274 -3 -183 vhcurveto + 10 -11 77 23 rlineto + -3 178 0 178 177 vvcurveto + 37 -2 61 38 3 vhcurveto + 1 20 21 1 20 hhcurveto + 59 95 1 -49 15 hvcurveto + 25 -82 rlineto + 25 hlineto + endchar + + + 161 699 32 rmoveto + -7 -70 11 36 hvcurveto + -3 81 -1 81 81 vvcurveto + 121 2 120 9 121 vhcurveto + -5 6 -88 -17 rlineto + -86 3 -104 -86 vvcurveto + -6 -1 -6 -11 vhcurveto + -346 hlineto + -10 -2 7 5 92 1 123 12 68 hvcurveto + -5 5 rlineto + -162 hlineto + -7 -7 1 -19 57 -20 14 4 2 -27 rlinecurve + 6 -83 0 -83 -83 vvcurveto + -122 0 -129 -10 -113 vhcurveto + 6 -5 92 28 rlineto + -6 50 0 44 58 54 1 57 45 vvcurveto + 7 6 5 7 vhcurveto + 343 hlineto + 9 3 -7 -5 -97 -3 -119 -2 -97 hvcurveto + 11 -21 rlineto + 149 hlineto + 6 14 rlineto + endchar + + + -265 275 23 rmoveto + -1 -43 11 6 -21 hvcurveto + -42 11 11 75 -1 43 rrcurveto + -1 61 -1 62 67 vvcurveto + 78 -6 119 9 59 vhcurveto + 1 12 8 11 13 3 67 15 rcurveline + 21 vlineto + -6 -80 callsubr + -22 vlineto + 80 -18 7 5 2 -30 rrcurveto + 3 -38 0 -38 -39 vvcurveto + -363 vlineto + -4 -83 13 -7 -98 -19 rrcurveto + -26 265 vlineto + endchar + + + -265 252 -87 callsubr + 185 -708 -91 callsubr + + + -265 -26 732 -106 callsubr + 132 -890 -91 callsubr + + + -265 297 816 -107 callsubr + 180 -793 -91 callsubr + + + -265 7 886 -105 callsubr + 221 -899 -91 callsubr + + + -280 175 608 rmoveto + 18 9 17 12 3 vhcurveto + 68 14 2 24 -7 -80 callsubr + -21 vlineto + 72 -18 rlineto + 12 -3 4 -23 -11 vvcurveto + -512 vlineto + -202 -47 -61 -78 -49 vhcurveto + 14 -18 rlineto + 134 69 62 101 155 vvcurveto + endchar + + + 48 178 319 rmoveto + 108 -109 112 -105 105 -112 85 31 rcurveline + 1 11 -61 54 -165 164 -107 107 rlinecurve + -4 4 -1 2 3 vvcurveto + 3 5 5 3 3 vhcurveto + 291 294 1 9 rlineto + -90 hlineto + -287 -326 -8 1 rlineto + 202 4 83 11 33 vhcurveto + -7 7 rlineto + -158 hlineto + -8 -7 -2 -17 rlineto + 6 60 -16 -17 9 hvcurveto + 4 -10 1 -11 -10 vvcurveto + -594 vlineto + 8 -5 81 29 rlineto + -6 97 0 98 98 vvcurveto + endchar + + + -51 482 58 rmoveto + -1 -6 -182 -14 -104 hhcurveto + -5 -7 7 6 -1 hvcurveto + -4 108 -3 116 113 vvcurveto + 80 2 78 4 73 vhcurveto + 1 11 5 12 12 2 rrcurveto + 5 21 43 9 1 hhcurveto + 21 vlineto + -6 6 rlineto + -237 hlineto + -7 -7 -1 -17 rlineto + 1 37 -8 -4 20 hvcurveto + 15 -3 6 -16 -14 vvcurveto + -478 vlineto + -52 -6 -53 -16 -22 vhcurveto + -14 vlineto + 138 201 0 -7 74 hvcurveto + 14 53 rlineto + endchar + + + 203 368 673 rmoveto + -115 -227 -123 -222 -127 -220 13 -10 rcurveline + 27 4 26 9 25 10 28 66 146 294 95 188 rrcurveto + 12 hlineto + 63 -188 59 -190 68 -186 23 -8 rcurveline + 53 10 52 14 52 16 1 22 rcurveline + -67 -3 -13 -1 -14 8 -5 12 rlinecurve + -96 200 -63 212 -54 215 rrcurveto + endchar + + + 417 475 147 rmoveto + -4 -2 -6 -5 -4 hhcurveto + -4 -5 10 4 -2 hvcurveto + -83 177 -94 200 -55 161 rrcurveto + -176 hlineto + -7 -7 -2 -22 68 -19 rlineto + 18 -5 10 -16 -18 vvcurveto + -4 0 -4 -1 -4 vhcurveto + -27 -198 -35 -197 -38 -196 7 -3 rcurveline + 75 26 rlineto + 90 7 34 435 21 hhcurveto + 4 4 -5 -5 3 hvcurveto + 63 -128 94 -229 75 -180 rrcurveto + 30 hlineto + 286 554 rlineto + 5 3 5 3 3 hhcurveto + 5 3 -7 -8 hvcurveto + 2 -66 8 -246 -25 vvcurveto + -182 vlineto + -26 33 -9 30 40 52 18 16 44 vhcurveto + 24 vlineto + -2 -18 -25 -4 -13 hhcurveto + -33 -22 27 29 -3 hvcurveto + -17 164 -1 153 164 vvcurveto + 44 -2 37 27 14 vhcurveto + 12 -103 vlineto + endchar + + + 187 577 678 -77 callsubr + + + 187 393 841 -103 callsubr + 137 -142 -77 callsubr + + + 192 320 -18 -100 callsubr + + + 452 896 384 -62 callsubr + -117 -1 rlineto + 13 -37 -39 6 -39 -39 callsubr + 47 45 6 12 40 vhcurveto + 528 -82 callsubr + -756 12 rmoveto + 152 64 160 173 99 62 -62 -80 34 vhcurveto + -363 vlineto + -76 -34 -62 -56 -97 hhcurveto + -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + endchar + + + 209 557 918 -104 callsubr + -75 -782 -100 callsubr + + + 192 218 742 -106 callsubr + -67 -941 -100 callsubr + + + 192 541 826 -107 callsubr + -19 -844 -100 callsubr + + + 192 251 896 -105 callsubr + 22 -950 -100 callsubr + + + 360 853 60 rmoveto + -70 -96 -5 -4 -85 hvcurveto + 12 vlineto + 135 55 50 138 129 vvcurveto + 153 -69 151 -237 -99 -99 -23 -71 -71 vhcurveto + -68 -68 -28 -93 -96 vvcurveto + -113 30 -97 110 -59 vhcurveto + -6 -15 -53 5 -76 3 -61 3 rlinecurve + -17 -61 rlineto + 3 40 40 1 41 hhcurveto + 69 69 -4 -6 70 hvcurveto + 21 55 rlineto + -144 28 -45 130 118 vvcurveto + 160 68 165 190 167 68 -149 -137 -138 -43 -137 -154 -36 vhcurveto + -9 -58 rlineto + 4 56 56 2 56 hhcurveto + 59 60 -2 -5 59 hvcurveto + 25 53 rlineto + endchar + + + 192 320 -18 -41 callsubr + -21 21 -25 16 -26 12 43 100 rcurveline + -5 11 -22 5 -11 -2 -44 -100 rlineto + 9 -31 -33 4 -33 -22 callsubr + -129 45 -133 118 -51 vhcurveto + -46 -106 3 -14 32 -8 50 114 rlineto + -6 23 26 -3 28 hhcurveto + 51 678 rmoveto + 41 35 -11 -18 29 hvcurveto + -240 -554 -8 7 -7 8 -8 8 rlinecurve + -23 callsubr + 230 -324 rmoveto + -150 -62 -163 -166 -27 -37 5 24 -40 vhcurveto + 240 553 rlineto + 66 -65 26 -111 -93 vvcurveto + endchar + + + 192 379 851 -103 callsubr + -106 -848 -100 callsubr + + + -18 172 22 rmoveto + -1 101 -6 126 25 -44 callsubr + -257 -46 callsubr + rlineto + 147 646 rmoveto + 92 81 -30 -104 -111 -94 -38 callsubr + + + 187 234 657 rmoveto + 63 -9 rlineto + 13 -2 10 -12 -14 vvcurveto + -12 vlineto + -8 -7 -82 -2 -81 -29 -57 -58 rlinecurve + -47 -48 -17 -67 -65 vvcurveto + -173 141 -71 144 -2 vhcurveto + 7 -6 -2 -16 -6 -22 -16 -4 rlinecurve + -62 -15 rlineto + -21 268 24 vlineto + -59 12 -21 4 -13 18 -3 20 rlinecurve + 8 6 72 3 92 27 52 52 rlinecurve + 53 53 20 77 75 vvcurveto + 130 -77 98 -213 vhcurveto + -7 7 rlineto + 13 vlineto + 14 9 14 15 2 vhcurveto + 63 10 rlineto + 25 vlineto + -259 -2 rlineto + 179 -111 rmoveto + 109 -2 89 -48 -171 vvcurveto + -119 -60 -116 -139 -3 vhcurveto + -6 8 rlineto + 443 vlineto + -93 -451 rmoveto + -126 3 -67 121 109 vvcurveto + 116 71 105 122 5 vhcurveto + 7 -8 rlineto + -444 vlineto + endchar + + + 123 668 686 rmoveto + -2 -81 -119 -3 -44 hhcurveto + -198 hlineto + -75 -75 4 5 -75 hvcurveto + -30 vlineto + 57 -17 9 -3 9 -8 rrcurveto + 12 -12 1 -56 -30 vvcurveto + -73 vlineto + -154 -1 -152 -7 -153 vhcurveto + 7 -6 85 19 rlineto + -2 103 -3 122 82 vvcurveto + 102 0 101 7 101 vhcurveto + 8 8 6 6 vhcurveto + 289 hlineto + 2 11 -3 -10 hvcurveto + 1 -108 1 -121 -108 vvcurveto + -98 0 -97 -3 -98 vhcurveto + 14 -11 80 22 rlineto + -10 135 -2 134 135 vvcurveto + 101 2 115 5 7 vhcurveto + 4 3 4 2 5 1 76 17 rcurveline + endchar + + + 191 443 251 rmoveto + 117 2 74 32 31 203 16 90 1 55 44 28 -3 18 rcurveline + -35 -4 -35 -8 -34 -12 -12 -43 -1 -45 -6 -44 -18 -127 -29 -114 -112 -6 -7 6 rcurveline + -2 58 -1 59 59 vvcurveto + 75 6 74 7 75 vhcurveto + -4 8 -86 -23 rlineto + 6 -82 0 -120 -100 vvcurveto + -83 vlineto + -6 -7 rlineto + -150 8 -18 180 132 vvcurveto + 58 -7 41 -36 -12 -20 0 -2 -3 vhcurveto + -108 -36 7 -22 63 10 rlineto + 2 hlineto + 67 -47 -105 -167 49 hvcurveto + -90 23 71 -34 119 hhcurveto + 6 -6 rlineto + -155 vlineto + -9 -7 -36 -22 -4 vhcurveto + -68 -12 rlineto + -27 266 27 vlineto + -57 12 rlineto + -22 5 -11 21 22 vvcurveto + -2 158 rlineto + endchar + + + 195 722 -174 rmoveto + -6 -23 -48 -9 -16 hhcurveto + -89 -42 46 21 -15 hvcurveto + -20 26 -26 49 -16 30 4 10 rcurveline + 63 15 70 30 45 49 42 46 11 33 15 44 rrcurveto + 13 41 6 18 97 vvcurveto + 83 -20 110 -63 63 vhcurveto + 58 -58 -78 18 -77 hhcurveto + -95 -95 -19 -70 -68 hvcurveto + -74 -76 -27 -95 -138 vvcurveto + -90 29 -90 56 -63 vhcurveto + -55 49 77 -18 69 hhcurveto + -101 62 75 -118 116 hhcurveto + 51 65 25 16 39 hvcurveto + -364 216 rmoveto + -53 -55 30 40 -38 hvcurveto + -62 64 -23 89 89 vvcurveto + 147 50 179 192 151 74 -165 -157 -140 -50 -176 -186 vhcurveto + endchar + + + 3 275 331 rmoveto + 119 13 96 56 139 vvcurveto + 93 -81 47 -122 vhcurveto + -272 hlineto + -6 -6 -1 -17 rlineto + 9 68 -13 -32 hvcurveto + -57 3 -100 -15 vvcurveto + -145 -1 -146 -8 -145 vhcurveto + 11 -9 83 29 rlineto + -5 96 0 97 96 vvcurveto + 6 9 -4 -5 5 hvcurveto + 29 -29 127 -163 93 -119 99 26 rcurveline + 9 vlineto + -263 296 rlineto + -106 47 rmoveto + 5 4 175 2 64 vhcurveto + 19 1 3 7 8 hhcurveto + 40 hlineto + 78 89 -21 -96 -119 -106 -49 -110 -7 -2 9 6 hvcurveto + endchar + + + -61 451 606 rmoveto + 83 -44 -60 13 -73 hhcurveto + -109 -103 -65 -125 -98 62 -48 121 -52 hvcurveto + 60 -26 61 -54 -56 vvcurveto + -84 -65 -63 -78 -71 -41 51 70 -21 vhcurveto + -17 1 -57 -66 rlineto + -73 28 68 -29 69 hhcurveto + 127 146 92 132 80 -54 54 -105 46 hvcurveto + -78 34 -75 46 78 vvcurveto + 65 47 53 64 68 37 -46 -66 17 vhcurveto + 13 -3 rlineto + endchar + + + 26 299 362 rmoveto + 4 7 7 9 6 vvcurveto + 6 -2 5 -3 5 vhcurveto + -137 222 11 13 rlineto + 331 hlineto + 22 49 -4 11 rlineto + -5 -102 -102 -3 -102 hhcurveto + -36 -36 0 1 -36 hvcurveto + -68 -47 152 -225 14 -20 14 -24 8 -22 rlinecurve + -10 -25 -25 -34 -19 -26 -163 -216 rcurveline + -4 -19 -5 -27 -1 vvcurveto + 90 90 7 90 hhcurveto + 89 88 -1 -3 89 hvcurveto + 15 89 -3 10 rlineto + -8 -53 -54 -2 -54 hhcurveto + -89 -88 0 2 -89 hvcurveto + -5 10 rlineto + endchar + + + 6 543 696 rmoveto + -4 -88 -99 -6 -75 hhcurveto + -177 0 8 3 -95 hvcurveto + -7 -7 rlineto + -48 vlineto + 8 -7 rlineto + 4 111 79 3 24 hhcurveto + 5 4 -2 -4 hvcurveto + 1 -30 1 -144 -82 vvcurveto + -127 -5 -127 -8 -127 vhcurveto + 9 -9 100 27 rlineto + -7 121 -6 179 121 vvcurveto + 121 -1 85 14 21 21 -2 -8 168 vhcurveto + 8 7 rlineto + 48 vlineto + endchar + + + 233 348 -12 rmoveto + 196 194 83 310 87 -20 93 -63 63 hvcurveto + 57 -57 -84 20 -79 hhcurveto + -152 -139 -58 -100 -58 hvcurveto + -43 -74 -2 -42 -96 vvcurveto + -99 26 -102 71 -71 vhcurveto + -55 54 80 -16 76 hhcurveto + 43 43 rmoveto + -183 -74 166 148 159 53 159 194 68 69 -18 -49 49 hvcurveto + 57 -57 20 -82 -80 vvcurveto + -91 -6 -119 -59 -59 vhcurveto + -50 -50 -53 -27 -85 hhcurveto + -171 210 rmoveto + 27 65 hlineto + 14 15 2 10 vhcurveto + 2 46 51 2 40 35 34 -4 35 hhcurveto + 22 -3 -42 -22 hvcurveto + -5 -1 -4 -5 vvcurveto + 30 -1 rlineto + 214 -28 vlineto + 2 -51 rlineto + -31 1 -83 9 -40 hhcurveto + -53 -114 -5 21 hvcurveto + 19 -4 19 19 vvcurveto + -25 hlineto + 3 -108 rlineto + endchar + + + -18 168 679 rmoveto + -151 -46 callsubr + 83 28 rlineto + -1 101 -6 22 24 -44 callsubr + -105 hlineto + 1 27 1 53 4 19 rrcurveto + 61 -138 rmoveto + 92 81 -30 -104 -111 -96 -38 callsubr + + + 167 183 674 -95 callsubr + + + 167 482 -87 callsubr + -137 -57 -95 callsubr + + + 167 204 732 -106 callsubr + -190 -239 -95 callsubr + + + 167 527 816 -107 callsubr + -142 -142 -95 callsubr + + + 167 237 886 -105 callsubr + -101 -248 -95 callsubr + + + 137 672 546 rmoveto + 75 -21 76 -85 -155 -48 -199 -123 -21 vhcurveto + -9 hlineto + 130 -13 -32 192 -146 hhcurveto + -94 -29 -73 -69 -12 hvcurveto + 19 -7 rlineto + 40 12 27 37 47 hhcurveto + 84 48 -102 -77 21 hvcurveto + 20 -73 7 -76 -76 vvcurveto + -75 0 -75 -4 -75 vhcurveto + 17 -7 67 36 rlineto + 322 2 113 127 127 vhcurveto + 20 20 25 11 28 hhcurveto + 52 18 -38 -37 6 hvcurveto + endchar + + + 162 614 680 rmoveto + -25 -43 -25 -44 -19 -45 -119 -274 rcurveline + -41 -89 -23 -52 -7 -2 -2 1 -4 2 -2 4 -71 182 -55 187 -39 191 -175 -10 rcurveline + -7 -6 1 -27 56 -8 23 -5 16 -33 rlinecurve + 20 -44 13 -46 15 -46 143 -482 rcurveline + 10 -7 68 26 57 165 73 160 72 133 rlinecurve + 12 21 62 110 65 79 -6 19 rcurveline + endchar + + + 505 965 675 rmoveto + -17 -32 -22 -39 -21 -46 -109 -242 rcurveline + -80 -170 rlineto + -3 -2 -2 -4 -9 hhcurveto + -18 -19 131 55 -12 hvcurveto + -31 146 -31 151 62 vvcurveto + -7 6 -76 -29 -45 -126 -132 -291 -42 -83 rlinecurve + -2 -1 -3 -2 -3 hhcurveto + -2 -4 1 5 -1 hvcurveto + -39 175 -59 270 -15 81 -156 -3 rcurveline + -8 -7 2 -24 31 -6 30 -7 11 -28 rlinecurve + 30 -77 20 -81 20 -81 30 -126 25 -127 23 -128 11 -5 rcurveline + 64 29 47 155 81 179 54 121 rlinecurve + 28 63 rlineto + 5 2 4 7 3 hhcurveto + 5 1 -7 -5 1 hvcurveto + 40 -179 37 -179 32 -181 12 -8 rcurveline + 60 27 65 157 116 230 47 77 rlinecurve + 115 188 rlineto + 21 vlineto + endchar + + + 79 612 687 rmoveto + -95 -13 -9 -21 -138 -198 -33 -33 rlinecurve + -9 hlineto + -147 266 -45 -3 -76 -4 -25 -1 rlinecurve + -7 -6 rlineto + -25 vlineto + 41 -11 42 -10 22 -38 rrcurveto + -82 47 93 -163 5 hhcurveto + -271 -329 rlineto + -16 vlineto + 94 11 36 76 111 157 43 52 rlinecurve + 12 hlineto + 143 -239 13 -22 15 -22 18 -18 rlinecurve + 14 -6 110 27 rlineto + 16 vlineto + -5 4 -8 2 -22 14 -7 7 rlinecurve + -60 72 -40 48 -115 189 -1 12 rlinecurve + 4 7 33 44 30 35 187 206 rcurveline + endchar + + + 68 49 695 rmoveto + -5 -57 -1 -58 -7 -57 27 2 rcurveline + 23 64 rlineto + 20 7 24 9 20 hhcurveto + 346 hlineto + 18 23 -12 -21 4 hvcurveto + 16 -61 rlineto + 34 hlineto + -22 164 rlineto + -425 -359 rmoveto + 2 47 47 1 47 hhcurveto + 55 54 -1 -1 54 hvcurveto + 15 72 rlineto + -3 -64 -63 -2 -64 hhcurveto + -37 -37 0 2 -37 hvcurveto + 405 -252 rmoveto + -63 -18 1 -12 -22 hhcurveto + -401 hlineto + -17 -15 11 19 -5 hvcurveto + -14 51 -26 -1 rlineto + 4 -51 7 -100 -1 vvcurveto + -2 172 343 -4 1 hhcurveto + 15 153 rlineto + endchar + + + 47 231 -2 rmoveto + 11 -9 90 29 -9 288 83 128 74 96 111 145 rlinecurve + -4 18 -84 callsubr + 149 -295 rcurveline + -100 0 -101 -3 -100 vhcurveto + endchar + + + 47 451 -87 callsubr + -58 -733 rmoveto + 11 -9 90 29 -9 288 83 128 74 96 111 145 rlinecurve + -4 18 -84 callsubr + 149 -295 rcurveline + -100 0 -101 -3 -100 vhcurveto + endchar + + + 58 552 683 rmoveto + -149 -148 3 9 -148 hvcurveto + -9 -8 rlineto + -54 vlineto + 6 -5 rlineto + 3 27 102 6 187 hhcurveto + 7 -10 -424 -606 1 -21 rlineto + 192 254 0 -12 129 hvcurveto + 18 71 -9 9 rlineto + -429 hlineto + -6 -7 90 139 174 271 135 193 rlinecurve + endchar + + + 3 278 466 -102 callsubr + + + 3 389 702 -104 callsubr + 51 -82 -102 callsubr + + + 3 111 549 -106 callsubr + -2 -264 -102 callsubr + + + -25 405 664 -104 callsubr + endchar + + + -545 115 664 -104 callsubr + endchar + + + 3 434 633 -107 callsubr + 46 -167 -102 callsubr + + + 207 707 -20 callsubr + -67 -64 -25 -46 -48 vhcurveto + 39 -22 -65 20 -42 hhcurveto + -170 -68 -140 -141 -90 36 -107 111 67 65 41 37 51 hvcurveto + -46 25 41 -32 68 -63 callsubr + -104 -48 rmoveto + -18 -37 -7 -43 -42 vvcurveto + -45 5 -46 14 -40 vhcurveto + -21 -29 -34 -20 -37 hhcurveto + -47 callsubr + 12 -13 3 -18 1 -19 rrcurveto + endchar + + + 3 144 703 -105 callsubr + 87 -273 -102 callsubr + + + 64 410 307 rmoveto + -10 1 rlineto + 55 -15 -34 105 -89 hhcurveto + -151 -81 -161 -138 -68 25 -113 81 60 60 50 44 36 hvcurveto + 65 78 11 -2 46 -134 rlineto + -25 6 25 -19 23 hhcurveto + 34 49 42 54 68 hvcurveto + -7 19 -10 1 rlineto + -21 -27 -35 -25 -25 hhcurveto + -48 -34 127 60 -16 hvcurveto + 1 92 138 46 69 vhcurveto + -51 23 rlineto + -155 -256 rmoveto + -72 -51 -58 -78 -58 hhcurveto + -69 -17 97 57 74 24 121 92 76 27 -87 -112 34 hvcurveto + endchar + + + 193 326 356 rmoveto + 3 23 23 2 23 hhcurveto + 22 23 0 -16 16 hvcurveto + 21 -21 15 -28 -30 vvcurveto + -48 -12 -49 -26 -38 vhcurveto + -84 86 -64 93 -48 106 17 8 74 43 30 28 rrcurveto + 33 30 14 37 44 vvcurveto + 55 -52 37 -50 -102 -61 -87 -91 -42 10 -42 16 -39 vhcurveto + -111 -68 -47 -43 -91 vvcurveto + -55 23 -54 39 -39 vhcurveto + -43 43 64 -12 60 hhcurveto + 58 55 28 32 40 hvcurveto + 5 -4 rlineto + -34 35 45 -25 50 hhcurveto + 109 43 106 89 16 hvcurveto + -21 5 rlineto + -64 -15 -30 -72 -71 hhcurveto + -40 -39 31 28 -26 hvcurveto + -3 3 rlineto + 41 53 33 60 67 vvcurveto + 21 -4 21 -5 21 vhcurveto + 49 57 0 -7 41 hvcurveto + 3 48 rlineto + -3 -30 -74 0 -52 hhcurveto + -67 -77 0 3 -56 hvcurveto + -78 36 rmoveto + -17 40 -11 41 43 vvcurveto + 46 5 58 60 32 35 -46 -35 -65 -21 -30 -83 -52 vhcurveto + 146 -367 rmoveto + -26 -32 -38 -11 -53 hhcurveto + -99 -67 94 93 63 21 50 68 45 hvcurveto + 46 -110 74 -109 80 -89 rrcurveto + endchar + + + 3 177 613 -52 callsubr + 71 -147 -102 callsubr + + + 127 342 291 rmoveto + 25 -41 -50 31 -44 hhcurveto + -59 -36 -49 -58 -29 hvcurveto + 22 -12 rlineto + 53 29 21 24 40 hhcurveto + 29 27 -13 -15 24 hvcurveto + 99 -63 rlineto + -20 31 36 -16 38 hhcurveto + 55 37 49 48 20 hvcurveto + -21 11 rlineto + -37 -20 -20 -30 -40 hhcurveto + -27 -25 12 14 -22 hvcurveto + endchar + + + -244 175 448 rmoveto + -8 36 -2 33 -1 35 26 -20 24 -22 17 -19 26 29 rcurveline + -28 13 -29 20 -31 23 28 20 28 17 32 15 -25 31 rcurveline + -20 -21 -23 -21 -25 -20 2 33 2 29 7 33 rrcurveto + -40 hlineto + 8 -33 0 -31 -32 vvcurveto + -25 19 -21 19 -22 21 -27 -28 rcurveline + 29 -15 27 -16 29 -21 -26 -18 -27 -18 -34 -17 21 -35 rcurveline + 24 28 26 23 27 21 -1 -43 -2 -30 -6 -38 rrcurveto + endchar + + + 183 472 371 rmoveto + 16 -25 -35 8 -25 hhcurveto + -132 -56 -97 -99 -64 29 -74 88 46 44 22 22 39 hvcurveto + 12 -3 rlineto + -24 4 11 -17 29 hhcurveto + 34 61 34 27 24 hvcurveto + 39 39 27 53 5 63 14 185 -185 137 -175 -34 -109 -21 -98 -87 -52 -86 -56 -92 -9 -122 57 -98 44 -76 83 -68 105 -8 43 42 rcurveline + -14 15 -67 5 -58 28 -42 39 rlinecurve + -98 105 6 189 91 109 42 35 50 25 53 10 168 32 163 -114 -13 -178 rrcurveto + -54 -4 -23 -90 -63 hhcurveto + -27 -2 29 17 hvcurveto + 27 -1 28 27 vvcurveto + 52 0 52 4 52 vhcurveto + -4 4 rlineto + -59 -255 rmoveto + -15 -23 -29 -16 -32 hhcurveto + -29 -32 6 23 -17 hvcurveto + -18 24 -6 31 1 29 1 71 24 38 18 15 rrcurveto + 18 21 26 9 29 hhcurveto + 20 19 -10 -13 14 hvcurveto + 13 -12 0 -19 -18 vvcurveto + endchar + + + 3 272 658 -103 callsubr + -41 -171 -102 callsubr + + + -23 -14 640 rmoveto + 86 -13 8 7 -35 vvcurveto + -476 vlineto + -111 66 -22 51 114 117 80 107 35 vhcurveto + 14 43 5 44 44 vvcurveto + 84 -48 76 -93 -68 -58 -34 -40 -53 vhcurveto + -9 5 rlineto + 33 vlineto + 82 6 81 8 82 vhcurveto + -6 7 -169 -18 -6 -5 rlineto + 171 -314 rmoveto + 34 39 45 25 53 hhcurveto + 38 24 -23 -20 13 hvcurveto + 14 -21 16 -42 -73 vvcurveto + -92 -41 -97 -106 -88 -11 78 113 39 2 45 2 34 vhcurveto + endchar + + + -155 404 -184 rmoveto + 3 13 -388 893 -31 -7 -5 -11 389 -896 rlineto + endchar + + + -329 128 738 rmoveto + -40 -8 rlineto + -897 -92 callsubr + endchar + + + -15 325 392 rmoveto + 65 25 58 71 75 vvcurveto + 75 -61 60 -75 -106 -71 -57 -81 -38 vhcurveto + -22 -47 -8 -78 -2 -51 -8 -190 4 -191 -5 -190 12 -15 rcurveline + 76 33 rlineto + -7 125 -2 126 126 vvcurveto + 186 -6 64 22 87 vhcurveto + 61 15 35 45 68 hhcurveto + 60 41 -55 -56 -106 -80 -48 -89 hvcurveto + -2 -36 rlineto + 2 21 21 0 21 hhcurveto + 98 67 -57 -101 -74 -36 -99 -84 -38 -34 31 38 hvcurveto + 7 vlineto + -13 6 -49 -69 rlineto + -35 20 36 -14 38 hhcurveto + 129 116 79 138 48 -20 50 -34 35 hvcurveto + -30 31 -55 12 -49 2 rrcurveto + endchar + + + -232 303 -154 rmoveto + -97 -36 2 182 91 7 120 -92 32 hvcurveto + 1 vlineto + 64 23 21 88 133 vvcurveto + 66 -4 101 50 13 vhcurveto + 7 27 31 1 29 hhcurveto + 24 vlineto + -160 -24 -1 -215 -93 6 -88 -32 -28 hvcurveto + -19 -22 -24 -1 -39 hhcurveto + -26 vlineto + 31 37 -2 -21 19 hvcurveto + 25 -28 0 -105 -69 vvcurveto + -101 -8 -85 75 -20 vhcurveto + -6 24 53 0 39 hhcurveto + endchar + + + -232 10 -175 rmoveto + 149 34 -1 213 104 -3 101 61 15 hvcurveto + 17 4 19 2 18 -1 rrcurveto + 26 vlineto + -107 -4 36 193 114 6 30 -32 40 hvcurveto + -27 34 -53 -3 -78 1 rrcurveto + -24 vlineto + 62 50 4 -74 15 hvcurveto + 12 -79 -10 -81 11 -81 9 -68 32 -40 37 -13 rrcurveto + -1 vlineto + -92 -33 7 -123 -87 vvcurveto + -67 3 -98 -56 -13 vhcurveto + -6 -23 -30 0 -27 hhcurveto + endchar + + + -287 247 736 rmoveto + -54 -66 0 5 -39 hvcurveto + -866 vlineto + 5 52 53 0 54 hhcurveto + 24 vlineto + -119 13 rlineto + 782 vlineto + 119 13 rlineto + endchar + + + -287 130 -83 rmoveto + -119 -13 rlineto + -24 vlineto + 54 53 0 -5 52 hvcurveto + 866 vlineto + -5 -39 -66 0 -54 hhcurveto + -24 vlineto + 119 -13 rlineto + endchar + + + -337 124 738 rmoveto + -40 -8 rlineto + -403 -92 callsubr + -91 vmoveto + -40 -8 rlineto + -403 -92 callsubr + endchar + + + -213 69 265 -32 callsubr + endchar + + + -90 425 116 rmoveto + -59 callsubr + 89 73 54 61 62 hvcurveto + -11 18 rlineto + endchar + + + -90 180 -122 -53 callsubr + 15 36 rcurveline + 71 14 59 46 52 51 -11 18 rcurveline + -9 2 rlineto + -59 callsubr + hvcurveto + 1 2 0 1 hhcurveto + endchar + + + -25 188 -57 callsubr + + + -545 -72 -57 callsubr + + + -84 418 116 rmoveto + -38 -44 -50 -31 -59 hhcurveto + -2 388 hlineto + 39 -5 29 -38 8 -62 17 -6 rcurveline + -14 callsubr + -11 -10 -1 -1 -10 hvcurveto + 169 vlineto + -40 -8 rlineto + -168 vlineto + -109 -29 -73 -95 -125 vvcurveto + -99 10 -137 163 vhcurveto + 3 3 0 3 hhcurveto + -148 -92 callsubr + 146 vlineto + 67 15 58 45 50 49 -11 18 rcurveline + -303 134 rmoveto + 77 34 85 65 21 vhcurveto + -378 vlineto + -81 24 -18 96 75 vvcurveto + endchar + + + -20 284 206 rmoveto + -90 192 rlineto + 30 -14 -23 38 -37 hhcurveto + -25 -25 -8 -15 -19 hvcurveto + -63 -48 15 -21 rlineto + 15 19 28 22 18 hhcurveto + 29 22 -34 -28 14 hvcurveto + 35 -72 74 -142 -1 vvcurveto + -74 -96 -69 -99 -68 -100 50 -30 rcurveline + 17 6 36 91 60 89 58 88 rlinecurve + 10 hlineto + -147 62 42 -133 66 hhcurveto + 41 54 32 25 43 hvcurveto + -8 23 rlineto + -11 -21 -24 -4 -24 hhcurveto + -62 -70 170 118 -53 hvcurveto + 15 21 17 19 16 19 179 206 rcurveline + -1 7 -33 32 -20 -4 -187 -250 rlineto + endchar + + + -45 103 511 -106 callsubr + endchar + + + -545 -163 511 -106 callsubr + endchar + + + -361 35 398 -88 callsubr + -353 vmoveto + -30 callsubr + endchar + + + -312 77 -210 rmoveto + 71 82 33 51 50 vvcurveto + 35 -35 130 -53 -25 -34 -22 -26 -10 3 -11 4 -5 vhcurveto + 70 -83 rlineto + 9 -11 4 -17 -14 vvcurveto + -40 -31 -49 -35 -46 vhcurveto + endchar + + + 87 -68 callsubr + 413 126 rmoveto + 42 -31 -46 14 -52 hhcurveto + -63 -60 -18 -36 -44 hvcurveto + -42 -35 -13 -49 -48 vvcurveto + -49 16 -49 42 -35 vhcurveto + -28 34 49 -10 48 hhcurveto + 52 48 22 24 43 hvcurveto + -10 14 rlineto + -19 -34 -37 -15 -41 hhcurveto + -49 -26 14 28 -33 hvcurveto + -20 16 -28 50 46 vvcurveto + 44 11 49 36 31 vhcurveto + 22 26 38 11 36 hhcurveto + 49 39 -20 -45 20 hvcurveto + 8 hlineto + endchar + + + 45 75 484 rmoveto + 49 -49 rlineto + -30 -34 -12 -36 -52 vvcurveto + -50 12 -35 30 -38 vhcurveto + -49 -49 45 -45 48 48 rlineto + -30 37 37 -12 53 hhcurveto + 53 37 12 30 37 hvcurveto + 48 -48 45 45 -49 49 rlineto + 30 38 12 35 50 vvcurveto + 52 -12 36 -30 34 vhcurveto + 49 49 -47 47 -48 -48 rlineto + 28 -38 -39 13 -48 hhcurveto + -48 -40 -13 -28 -37 hvcurveto + -48 48 rlineto + 176 -66 rmoveto + 81 70 -70 -82 -84 -69 -68 -85 -85 -69 68 85 83 70 68 87 hvcurveto + endchar + + + 6 269 638 rmoveto + 33 47 -1 -35 11 hvcurveto + 7 -26 -1 -72 1 -53 -7 -4 rcurveline + 9 -27 -27 6 -29 hhcurveto + -162 -75 -142 -140 -89 35 -109 114 59 64 37 35 51 hvcurveto + -35 2 18 -38 39 hhcurveto + 39 51 36 27 39 hvcurveto + -8 23 rlineto + -8 -20 -31 -11 -10 hhcurveto + -30 -6 33 29 -2 hvcurveto + 565 vlineto + -8 9 -163 -20 -5 -4 rlineto + 95 -565 rmoveto + -27 -27 -56 -20 -35 hhcurveto + -90 -28 85 70 94 34 131 112 83 11 -64 -54 hvcurveto + endchar + + + -213 69 -83 callsubr + + + -122 349 687 rmoveto + 4 -29 -24 3 -27 hhcurveto + -73 -63 -21 -71 -35 hvcurveto + -6 -12 -5 -12 -13 vvcurveto + -38 54 -50 38 -35 vhcurveto + -77 -77 -81 -102 -103 vvcurveto + -82 44 -87 104 131 103 131 129 55 -30 50 -38 39 vhcurveto + -95 91 rlineto + -80 76 -25 16 27 vvcurveto + 32 32 9 33 66 38 -7 -2 35 vhcurveto + 15 42 rlineto + -151 -257 rmoveto + 60 -60 76 -81 -72 vvcurveto + -83 -45 -82 -75 -85 -36 96 72 76 35 62 70 72 vhcurveto + endchar + + + -25 420 595 -107 callsubr + endchar + + + -545 160 595 -107 callsubr + endchar + + + 279 471 514 -89 callsubr + 273 -238 -16 callsubr + -267 -238 -89 callsubr + endchar + + + -69 439 593 rmoveto + 79 -42 -57 12 -69 -1 -1 0 -1 hhcurveto + 114 vlineto + -40 -8 rlineto + -110 vlineto + -86 -14 -73 -60 -102 vvcurveto + -89 54 -47 105 -46 vhcurveto + -275 vlineto + -2 -2 0 -2 hhcurveto + -67 -39 49 66 -20 hvcurveto + -16 1 -55 -63 rlineto + -69 27 64 -28 66 hhcurveto + 15 16 1 3 15 hvcurveto + -114 -92 callsubr + 116 vlineto + 93 29 81 74 96 vvcurveto + 76 -52 51 -100 44 vhcurveto + -7 3 -8 4 -7 3 rrcurveto + 251 vlineto + 54 -7 29 -41 15 -57 13 -3 rcurveline + -234 -3 rmoveto + 54 34 45 49 11 vhcurveto + -229 vlineto + -47 29 -36 37 53 vvcurveto + 213 -351 rmoveto + -63 -38 -49 -52 -19 vhcurveto + 247 vlineto + 48 -27 42 -44 -45 vvcurveto + endchar + + + -222 192 392 -98 callsubr + + + -257 18 375 -64 callsubr + + + -83 438 340 -93 callsubr + + + -107 354 714 -104 callsubr + 246 -220 -93 callsubr + + + -107 76 561 -106 callsubr + 193 -402 -93 callsubr + + + -107 399 615 -107 callsubr + 241 -275 -93 callsubr + + + -107 109 716 -105 callsubr + 282 -412 -93 callsubr + + + -45 312 396 rmoveto + 60 37 63 63 72 vvcurveto + 82 -70 56 -102 vhcurveto + -9 hlineto + -81 -32 -84 -46 -98 vvcurveto + -71 57 -58 55 -38 vhcurveto + -11 vlineto + -108 -63 -53 -39 -93 vvcurveto + -45 10 -45 32 -32 vhcurveto + -35 35 54 -10 48 hhcurveto + 119 123 78 129 80 -43 36 -106 72 hvcurveto + -33 27 rmoveto + -53 37 -60 54 59 vvcurveto + 39 11 28 46 30 vhcurveto + 85 43 -66 -50 -53 -30 -49 -42 -29 hvcurveto + -41 -78 rmoveto + 82 -52 54 -39 -75 vvcurveto + -79 -46 -57 -83 -79 -43 75 70 77 46 44 69 36 vhcurveto + endchar + + + 230 231 -76 callsubr + + + 230 506 -76 callsubr + + + -175 335 430 rmoveto + 22 -31 -35 19 -39 hhcurveto + -85 -82 -55 -96 -30 20 -34 23 -14 hvcurveto + -7 vlineto + -54 -25 -31 -44 -57 vvcurveto + -79 74 -45 74 79 72 40 57 53 vhcurveto + -8 14 -9 2 rlineto + -32 -39 -48 -28 -46 hhcurveto + -64 -68 40 73 54 48 27 45 16 15 -1 -4 15 hvcurveto + 21 47 rlineto + -81 5 -58 -13 87 vvcurveto + 49 46 28 40 40 41 -21 -43 15 vhcurveto + 11 -1 rlineto + endchar + + + -125 213 258 rmoveto + -2 -1 -64 1 -37 hhcurveto + -6 6 rlineto + 78 2 35 87 96 hhcurveto + 53 26 -12 -59 42 hvcurveto + 13 2 37 53 rlineto + 37 -37 -49 22 -52 hhcurveto + -144 -105 -128 -140 -60 16 -62 43 -43 hvcurveto + -37 37 56 -12 51 hhcurveto + 72 71 42 44 56 hvcurveto + -12 20 -8 1 rlineto + -33 -39 -51 -16 -51 hhcurveto + -36 -45 5 24 -24 hvcurveto + -35 35 -18 48 -2 49 5 6 rcurveline + 1 26 42 2 1 hhcurveto + 47 64 0 -1 30 hvcurveto + 14 42 rlineto + endchar + + + 278 745 369 -15 callsubr + 6 -157 -15 callsubr + endchar + + + -5 498 -164 rmoveto + -15 122 -2 123 123 vvcurveto + 177 11 85 -104 -64 -71 -38 -37 -56 vhcurveto + -11 2 rlineto + 49 -3 -25 21 -41 hhcurveto + -45 -49 -41 -29 -36 hvcurveto + 16 -18 rlineto + 14 22 28 19 19 hhcurveto + 37 2 -42 -32 hvcurveto + -335 vlineto + 9 -10 72 25 rlineto + -3 57 -4 67 46 vvcurveto + 53 0 83 2 24 vhcurveto + 29 41 48 29 47 hhcurveto + 105 -20 -107 -170 -105 0 -181 -1 -27 hvcurveto + 9 -11 rlineto + endchar + + + -84 144 662 rmoveto + 27 -16 23 -17 20 -22 -108 -57 rcurveline + 13 -39 122 65 22 -31 20 -36 18 -43 rlinecurve + -3 -5 -37 4 -23 -1 -21 -3 rlinecurve + -151 -24 -54 -135 20 -127 7 -46 25 -69 40 -35 41 -36 54 0 57 9 41 7 38 23 28 33 70 81 -2 114 -16 100 -15 96 -51 86 -62 62 92 49 rcurveline + -13 39 -112 -59 -31 25 -32 19 -33 11 rlinecurve + 187 -539 rmoveto + -8 -47 -23 -51 -52 -8 -98 -15 -41 119 -8 47 -14 90 16 133 116 18 27 4 28 -4 26 -7 14 -37 10 -39 6 -40 8 -53 3 -57 -10 -53 rrcurveto + endchar + + + 93 425 270 rmoveto + 10 40 rlineto + -225 hlineto + -1 11 -1 12 11 vvcurveto + 9 0 9 1 8 vhcurveto + 242 hlineto + 10 40 rlineto + -249 hlineto + 34 246 224 39 63 -166 14 -1 rcurveline + 57 58 -125 142 -168 -22 -101 -116 rlinecurve + -46 -53 -26 -61 -12 -66 rrcurveto + -65 hlineto + -10 -40 rlineto + 70 hlineto + -1 -15 -1 -14 -15 -5 0 -6 -5 vvcurveto + -84 hlineto + -10 -40 rlineto + 97 hlineto + 9 -79 27 -75 57 -57 rrcurveto + -45 45 53 -18 52 hhcurveto + 85 -1 81 43 41 38 -17 29 rcurveline + -71 -37 -104 -23 -77 64 -42 35 -31 60 -14 66 rrcurveto + endchar + + + -329 112 186 rmoveto + 36 371 rlineto + 3 29 2 29 29 vvcurveto + 20 -7 26 -30 -32 -18 -14 -51 vhcurveto + -1 -17 3 -22 1 -19 27 -383 rcurveline + -42 -138 -88 callsubr + endchar + + + -329 54 442 -88 callsubr + 58 -140 rmoveto + -16 2 -27 -383 -1 -19 -3 -22 1 -17 rlinecurve + -51 18 -14 32 30 7 26 20 29 -2 29 -3 29 vhcurveto + endchar + + + -216 3 428 rmoveto + -4 -22 5 -7 rlineto + 112 -81 callsubr + 115 hlineto + 7 6 7 22 -5 7 rlineto + -124 -86 callsubr + 102 17 87 43 47 7 -43 -21 4 vhcurveto + 12 -4 58 54 rlineto + 27 -13 -26 27 -54 hhcurveto + -25 callsubr + -105 hlineto + endchar + + + -228 314 641 rmoveto + 28 -22 vlineto + -63 -60 -37 -70 -30 hvcurveto + -16 -36 -2 -51 -35 vvcurveto + -6 -6 rlineto + -105 hlineto + -7 -6 -4 -22 5 -7 rlineto + 112 -81 callsubr + 115 hlineto + 7 6 7 22 -5 7 rlineto + -124 -86 callsubr + 66 6 64 22 37 vhcurveto + 12 20 16 9 22 2 43 4 -10 -2 6 1 rrcurveto + endchar + + + -45 125 594 rmoveto + 6 6 4 6 48 126 3 2 87 vhcurveto + 27 78 rlineto + -335 hlineto + -7 -7 rlineto + -327 vlineto + 13 -11 rlineto + 31 32 41 22 44 hhcurveto + 103 36 -90 -82 -102 -54 -95 -112 -62 -35 57 49 -22 hvcurveto + -11 hlineto + -44 -56 1 -12 rlineto + -49 41 61 -26 63 hhcurveto + 145 125 109 153 112 -74 80 -117 -46 -45 -17 -20 -41 hvcurveto + endchar + + + 103 356 -69 callsubr + + + 103 631 -69 callsubr + + + -45 285 669 rmoveto + -286 -434 rlineto + -44 284 vlineto + 7 -9 rlineto + -63 0 -83 -5 -35 vhcurveto + 5 -6 80 33 rlineto + -3 22 0 79 54 vvcurveto + 8 8 rlineto + 82 hlineto + 16 37 -5 7 rlineto + -94 hlineto + -7 9 rlineto + 155 0 272 1 27 vhcurveto + -7 6 rlineto + -77 -469 rmoveto + -215 hlineto + -5 7 1 22 84 138 38 59 rlinecurve + 29 45 30 46 34 39 rrcurveto + 1 1 2 1 2 hhcurveto + 3 2 -3 -5 hvcurveto + -342 vlineto + endchar + + + 263 422 -73 callsubr + + + -75 callsubr + + + -69 -75 callsubr + + + -475 245 -90 callsubr + endchar + + + -34 365 45 rmoveto + -130 -4 -45 -107 -106 hhcurveto + -36 -46 41 36 -18 hvcurveto + -14 hlineto + -49 -62 rlineto + -46 49 45 -10 44 hhcurveto + 61 50 15 39 51 hvcurveto + 20 15 37 34 16 44 rrcurveto + 20 58 2 71 39 vvcurveto + 209 4 72 5 91 vhcurveto + -14 6 -51 -29 rlineto + 25 -33 -43 9 -41 hhcurveto + -128 -101 -103 -178 -116 62 -79 83 63 56 33 30 52 hvcurveto + 9 47 rmoveto + -18 -23 -56 -29 -46 hhcurveto + -50 -64 61 90 90 32 138 118 42 44 -21 -47 3 hvcurveto + endchar + + + 44 525 465 rmoveto + -37 -95 -82 -160 -65 -120 -8 2 rcurveline + 146 -24 231 -149 -77 -42 -34 -77 -50 vhcurveto + 16 -12 23 27 rlineto + 23 20 40 7 27 hhcurveto + 26 25 -13 -18 19 hvcurveto + 73 -72 31 -261 -39 vvcurveto + -53 -165 17 -14 18 -12 21 -7 rlinecurve + 34 26 rlineto + 5 52 3 55 53 vvcurveto + 23 vlineto + 17 43 75 134 90 124 80 131 rlinecurve + -60 27 rlineto + endchar + + + -92 3 428 rmoveto + -4 -22 5 -7 rlineto + 68 -81 callsubr + 153 hlineto + -76 -133 rlineto + -24 vlineto + 29 -23 48 -43 28 -49 21 -38 4 -39 -15 -44 -23 -67 -77 -58 -85 -17 5 -24 rcurveline + 162 103 100 128 1 hvcurveto + 94 -70 56 -51 41 vhcurveto + 83 146 7 22 -5 7 rlineto + -242 -86 callsubr + 102 17 87 43 47 7 -43 -21 4 vhcurveto + 12 -4 58 54 rlineto + 27 -13 -26 27 -54 hhcurveto + -25 callsubr + -61 hlineto + endchar + + + -25 70 665 -105 callsubr + endchar + + + -545 -130 665 -105 callsubr + endchar + + + 166 574 254 rmoveto + -9 vlineto + -518 -243 -4 -9 8 -24 10 -5 600 280 rlineto + 12 vlineto + -602 275 -10 -3 -10 -24 2 -10 rlineto + endchar + + + -129 374 36 -33 callsubr + 58 -202 -33 callsubr + endchar + + + -129 42 36 -37 callsubr + 166 -28 -37 callsubr + endchar + + + -281 12 238 rmoveto + 210 -202 -18 callsubr + rlineto + endchar + + + -281 252 238 rmoveto + -192 188 -31 -46 149 -146 -150 -170 14 -28 rlineto + endchar + + + 47 499 62 rmoveto + -53 9 83 41 hvcurveto + 74 vlineto + 80 6 70 -30 28 vhcurveto + 18 -19 -31 10 -15 hhcurveto + -73 -69 -40 -36 -59 hvcurveto + -8 8 rlineto + 92 0 99 4 85 vhcurveto + -6 7 -158 -17 -5 -4 rlineto + -18 vlineto + 27 -6 41 -8 9 -12 rrcurveto + 26 -36 -6 -79 -101 vvcurveto + -1 -132 -6 -132 -7 -132 6 -10 rcurveline + 72 22 rlineto + 108 2 110 110 vvcurveto + 28 39 48 32 55 hhcurveto + 74 12 -62 -76 hvcurveto + -36 -4 -87 -54 vvcurveto + -49 19 -50 47 60 53 49 47 44 vhcurveto + 11 vlineto + -13 10 rlineto + -18 -19 -32 -27 -39 hhcurveto + endchar + + + -192 297 276 -17 callsubr + + + -222 206 625 -89 callsubr + -14 -233 -98 callsubr + + + -287 279 707 -104 callsubr + 75 -161 -98 callsubr + + + -287 -51 562 -106 callsubr + 74 -351 -98 callsubr + + + -287 272 607 -107 callsubr + 122 -215 -98 callsubr + + + -287 -70 708 -105 callsubr + 215 -352 -98 callsubr + + + -267 266 108 rmoveto + -20 -20 -27 -24 -28 hhcurveto + -61 2 86 45 90 2 90 15 89 hvcurveto + -11 10 -81 -25 rlineto + -347 vlineto + -50 29 -61 52 57 55 56 48 38 vhcurveto + -13 14 rlineto + endchar + + + -254 159 683 rmoveto + -32 -27 -26 -32 -32 23 -28 33 35 26 30 34 32 -28 22 -30 hvcurveto + -141 -308 -64 callsubr + + + -29 154 266 rmoveto + 413 vlineto + 3 7 -160 -23 -5 -4 rlineto + -21 vlineto + 53 -6 24 -7 9 -31 rrcurveto + 7 -27 2 -48 -51 vvcurveto + -158 -8 -153 -4 -157 vhcurveto + 6 -7 71 20 rlineto + 221 vlineto + 12 7 rlineto + 71 -79 89 -120 0 vvcurveto + -38 33 16 -11 30 hhcurveto + 53 50 67 32 24 hvcurveto + -19 20 rlineto + -23 -22 -23 -16 -33 hhcurveto + -40 -97 110 75 -59 hvcurveto + -3 5 -5 5 6 vvcurveto + 5 11 9 7 6 vhcurveto + 67 56 71 51 75 44 rrcurveto + 11 vlineto + -46 29 -24 -14 -11 -11 -78 -71 rlinecurve + -134 -123 rlineto + endchar + + + -86 399 472 rmoveto + -94 -60 -88 -68 -76 -82 -6 2 rcurveline + 1 31 4 106 2 58 -5 6 rcurveline + -79 -26 rlineto + 3 -83 1 -82 -83 vvcurveto + -63 0 -64 -1 -63 vhcurveto + 16 -5 63 26 rlineto + -3 63 -3 66 61 vvcurveto + 9 4 76 -70 90 -76 85 -72 rlinecurve + 67 36 1 14 -89 64 -86 68 -80 75 rlinecurve + -4 11 rlineto + 2 0 2 1 2 vhcurveto + 43 51 113 65 89 38 1 15 rcurveline + endchar + + + -244 289 112 rmoveto + -22 -25 -28 -25 -33 hhcurveto + -60 4 12 91 99 vvcurveto + 140 10 140 4 140 vhcurveto + -6 7 -165 -20 -6 -5 rlineto + -23 vlineto + 32 -2 48 3 7 -31 rrcurveto + 5 -24 0 -43 -33 vvcurveto + -7 -378 rlineto + -115 31 -26 51 66 52 58 53 34 vhcurveto + -11 12 rlineto + endchar + + + -64 408 -11 rmoveto + 73 26 rlineto + 0 2 4 4 2 -1 1 1 vvcurveto + -101 220 -35 97 -18 52 -24 65 -30 107 -22 44 rrcurveto + 62 -32 -26 16 -32 hhcurveto + -52 -50 -15 -16 -44 hvcurveto + 8 -25 rlineto + 5 23 32 7 15 hhcurveto + 81 45 -170 -34 4 hvcurveto + -231 -435 18 -13 59 17 26 78 9 19 128 271 rlinecurve + 1 3 2 3 4 1 rrcurveto + 4 3 -3 -3 1 hvcurveto + 146 -384 rlineto + endchar + + + 165 653 528 rmoveto + -11 3 -601 -275 rlineto + -12 vlineto + 600 -280 10 5 11 23 -5 10 -519 241 rlineto + 12 vlineto + 522 241 2 9 rlineto + endchar + + + 232 57 409 rmoveto + -40 563 -163 40 203 vlineto + endchar + + + -165 296 84 rmoveto + -10 -8 -28 -23 -19 hhcurveto + -68 -11 108 91 -7 hvcurveto + 80 101 93 133 124 vvcurveto + 59 -18 37 -53 -98 -40 -114 -82 -17 vhcurveto + -14 -64 -4 -67 -66 vvcurveto + -28 0 -28 2 -27 vhcurveto + -66 -74 15 -18 46 44 9 -3 rlineto + -70 4 4 -116 106 hhcurveto + 55 41 50 28 17 hvcurveto + 28 40 -17 13 rlineto + -176 182 rmoveto + 89 14 107 10 55 vhcurveto + 40 7 22 77 36 hhcurveto + 22 16 -10 -56 -104 -41 -95 -78 -105 hvcurveto + endchar + + + 328 393 -10 rmoveto + 74 28 rlineto + -4 69 -2 71 70 vvcurveto + 46 1 46 1 46 vhcurveto + 16 28 35 18 49 hhcurveto + 65 20 -49 -82 hvcurveto + -74 -5 -120 -16 vvcurveto + -38 21 -39 47 60 55 48 41 45 vhcurveto + -7 21 rlineto + -14 hlineto + -18 -24 -32 -22 -21 hhcurveto + -44 -7 38 27 hvcurveto + 131 vlineto + 100 6 58 -26 27 vhcurveto + 21 -21 -29 6 -29 hhcurveto + -59 -63 -35 -20 -38 hvcurveto + -16 2 rlineto + 32 -19 -34 20 -37 hhcurveto + -60 -60 -40 -28 -52 -78 callsubr + -12 37 -50 vhcurveto + -49 -2 -48 -35 -40 -32 12 -19 rcurveline + 13 23 36 16 16 hhcurveto + 41 -1 -64 -75 -91 -6 -92 -1 -92 hvcurveto + 14 -8 67 24 rlineto + -2 41 0 42 42 vvcurveto + 73 2 72 3 72 vhcurveto + 6 9 61 38 47 hhcurveto + 66 16 -48 -83 hvcurveto + -114 -10 -127 -32 vvcurveto + endchar + + + -25 381 -21 callsubr + + + -545 121 -21 callsubr + + + 347 778 276 -16 callsubr + endchar + + + 137 415 434 rmoveto + 2 -57 2 -57 -58 vvcurveto + -21 -2 -73 -1 -48 vhcurveto + -39 -36 -56 -24 -36 hhcurveto + -85 -8 73 56 hvcurveto + 269 vlineto + -9 7 -83 -26 rlineto + 4 -24 13 -85 -55 vvcurveto + -189 vlineto + -92 -2 -92 -2 -92 vhcurveto + 12 -6 53 20 rlineto + -13 63 -6 75 66 vvcurveto + 6 2 rlineto + -20 17 13 -10 32 hhcurveto + 49 76 43 33 58 hvcurveto + 8 -5 rlineto + -41 6 11 -28 52 hhcurveto + 55 56 46 38 41 hvcurveto + -8 14 -11 2 rlineto + -15 -24 -30 -18 -23 hhcurveto + -47 -5 65 34 hvcurveto + 167 vlineto + 31 3 51 3 41 vhcurveto + -8 11 rlineto + endchar + + + 58 81 502 rmoveto + -24 -32 215 -215 -214 -215 23 -33 220 219 219 -219 23 33 -214 215 218 217 -25 32 -221 -221 rlineto + endchar + + + 86 195 18 rmoveto + -2 40 -1 30 28 vvcurveto + 73 3 88 3 72 vhcurveto + 29 36 47 32 46 hhcurveto + 71 19 -61 -100 hvcurveto + -5 -171 rlineto + -48 17 -40 55 48 63 44 45 46 vhcurveto + -9 21 rlineto + -13 hlineto + -19 -25 -32 -21 -23 hhcurveto + -55 7 45 151 64 0 96 -20 24 hvcurveto + 22 -19 -29 7 -29 hhcurveto + -64 -69 -38 -34 -56 -78 callsubr + -6 -16 31 -50 hhcurveto + -37 -57 -41 -30 -41 hvcurveto + 17 -22 rlineto + 19 29 25 16 21 hhcurveto + 33 4 -48 -67 -81 -7 -165 -2 -51 hvcurveto + 15 -7 rlineto + endchar + + + -45 214 11 rmoveto + 13 83 69 97 54 79 rrcurveto + 52 77 60 96 85 vvcurveto + 107 -71 67 -145 vhcurveto + -50 -22 -88 -46 -29 -36 rrcurveto + -29 -36 -10 -45 -52 vvcurveto + -96 85 -70 69 52 49 17 26 49 vhcurveto + 5 -6 rlineto + -32 -55 -85 -114 0 vvcurveto + -45 -58 -48 -64 -20 -46 10 -8 rcurveline + 222 393 rmoveto + -24 -24 -35 -8 -33 hhcurveto + -84 -46 86 77 52 33 77 57 108 55 -78 -84 -35 -6 -38 -25 -25 hvcurveto + endchar + + + 164 7 -72 callsubr + + + 164 282 -72 callsubr + + + 86 315 620 -103 callsubr + -167 -581 rmoveto + -2 40 -1 30 28 vvcurveto + 73 3 88 3 72 vhcurveto + 29 36 47 32 46 hhcurveto + 71 19 -61 -100 hvcurveto + -5 -171 rlineto + -48 17 -40 55 48 63 44 45 46 vhcurveto + -9 21 rlineto + -13 hlineto + -19 -25 -32 -21 -23 hhcurveto + -55 7 45 151 64 0 96 -20 24 hvcurveto + 22 -19 -29 7 -29 hhcurveto + -64 -69 -38 -34 -56 -78 callsubr + -6 -16 31 -50 hhcurveto + -37 -57 -41 -30 -41 hvcurveto + 17 -22 rlineto + 19 29 25 16 21 hhcurveto + 33 4 -48 -67 -81 -7 -165 -2 -51 hvcurveto + 15 -7 rlineto + endchar + + + -16 531 452 rmoveto + -57 16 -23 -10 -33 -129 -36 -110 -56 -118 rlinecurve + -5 hlineto + -26 119 -37 164 -55 55 rrcurveto + 21 -21 -33 11 -30 hhcurveto + -53 -43 -22 -39 -35 hvcurveto + 20 -26 rlineto + 10 15 21 8 31 hhcurveto + 73 43 -98 -66 23 hvcurveto + 27 -77 16 -81 12 -81 7 -7 rcurveline + 56 32 20 50 22 48 24 48 rlinecurve + 136 274 rlineto + endchar + + + 170 10 228 rmoveto + 6 -10 rlineto + 165 -19 callsubr + 207 -19 callsubr + 164 hlineto + 12 8 -6 33 rlineto + -158 hlineto + 58 209 rlineto + 154 hlineto + 12 8 -6 33 rlineto + -149 -24 callsubr + -207 -24 callsubr + -183 hlineto + -8 -10 4 -21 6 -10 rlineto + 170 hlineto + -59 -209 rlineto + -178 hlineto + -8 -10 rlineto + 229 10 rmoveto + 58 209 rlineto + 207 hlineto + -59 -209 rlineto + endchar + + + -8 431 59 -99 callsubr + + + -44 366 694 -104 callsubr + 227 -481 -99 callsubr + + + -44 88 555 -106 callsubr + 174 -677 -99 callsubr + + + -8 429 595 -107 callsubr + 204 -536 -99 callsubr + + + 270 770 -20 callsubr + -76 -72 -33 -57 -49 vhcurveto + -2 -2 rlineto + 47 -30 -51 32 -78 hhcurveto + -79 callsubr + hvcurveto + -34 callsubr + 1 1 1 2 2 1 rrcurveto + -44 24 42 -31 66 -63 callsubr + -388 -80 rmoveto + 74 18 54 36 54 hhcurveto + -42 callsubr + endchar + + + -44 121 695 -105 callsubr + 263 -672 -99 callsubr + + + 226 609 409 rmoveto + 48 -41 20 -63 -61 vvcurveto + -87 -45 -96 -94 -94 -14 118 85 65 0 71 9 59 vhcurveto + -6 7 -75 -28 rlineto + -189 vlineto + -53 -4 -71 -33 -33 vhcurveto + -24 -24 -31 -18 -34 hhcurveto + -90 -30 102 80 91 30 69 78 60 hvcurveto + -16 14 rlineto + -135 -47 -39 -126 -117 vvcurveto + -91 54 -98 104 70 57 54 46 45 vhcurveto + 12 hlineto + -77 36 28 -14 57 hhcurveto + 146 105 168 142 64 -25 62 -51 40 hvcurveto + -14 -3 -42 -48 rlineto + endchar + + + -45 92 639 rmoveto + -27 83 vlineto + 62 -15 -82 -111 -140 -3 -140 -5 -139 hvcurveto + 12 -5 84 27 rlineto + -3 76 0 198 136 vvcurveto + 89 2 90 5 89 vhcurveto + -6 12 rlineto + endchar + + + 227 427 -54 callsubr + + + 227 702 -54 callsubr + + + 245 589 -90 callsubr + -587 -51 callsubr + 566 -651 rmoveto + -222 hlineto + -4 -6 0 4 1 1 0 1 1 hvcurveto + 86 83 115 105 85 vvcurveto + 54 -47 39 -62 -61 -52 -33 -35 -39 vhcurveto + 14 -11 rlineto + 19 28 31 19 40 hhcurveto + 59 23 -45 -34 -71 -57 -61 -56 -55 hvcurveto + -38 -37 -41 -35 -41 -35 rrcurveto + -10 315 vlineto + 17 47 rlineto + endchar + + + 245 593 -90 callsubr + -591 -51 callsubr + 435 -304 -74 callsubr + + + -367 -28 685 rmoveto + -17 61 vlineto + 46 -12 -53 -73 -91 -3 -91 -3 -90 hvcurveto + 9 -3 62 17 rlineto + -2 49 0 130 88 vvcurveto + 58 1 58 4 58 vhcurveto + -5 8 rlineto + endchar + + + -179 269 550 rmoveto + 15 -23 -33 8 -23 hhcurveto + -123 -52 -90 -92 -59 28 -70 81 43 41 20 21 36 hvcurveto + 11 -2 rlineto + -22 4 10 -17 27 hhcurveto + 23 41 22 16 29 hvcurveto + -5 16 rlineto + -5 -16 -22 -7 -10 hhcurveto + -25 -2 26 16 hvcurveto + 25 -2 26 25 vvcurveto + 48 2 49 3 48 vhcurveto + -4 3 rlineto + -55 -236 rmoveto + -14 -21 -28 -15 -29 hhcurveto + -27 -29 6 21 -16 hvcurveto + -17 23 -5 28 1 27 1 66 21 35 17 14 rrcurveto + 16 20 24 9 27 hhcurveto + 18 18 -9 -12 13 hvcurveto + 12 -11 0 -17 -17 vvcurveto + endchar + + + -189 159 261 rmoveto + 51 53 13 34 35 hvcurveto + 32 32 10 43 42 vvcurveto + 43 -13 48 -37 30 vhcurveto + 21 -26 -35 5 -34 hhcurveto + -51 -53 -14 -34 -35 hvcurveto + -35 -34 -5 -48 -45 vvcurveto + -71 6 37 -65 100 hhcurveto + -74 214 rmoveto + 47 13 41 25 39 hhcurveto + 83 14 -81 -53 -54 -17 -71 -79 -81 -19 82 55 17 2 17 4 16 hvcurveto + endchar + + + -25 431 59 rmoveto + 44 49 14 66 65 vvcurveto + 88 -31 88 -84 35 vhcurveto + 28 65 -6 11 -22 5 -10 -2 -29 -68 rlineto + 3 -14 -14 1 -16 hhcurveto + -79 callsubr + hvcurveto + -48 -52 -7 -74 -69 vvcurveto + 5 -74 25 -73 62 -38 -34 -79 rcurveline + 2 -14 32 -8 37 85 rlineto + -6 19 22 -3 24 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 18 16 -3 -6 14 hvcurveto + -145 -334 rlineto + -28 44 -9 63 49 vvcurveto + 26 2 26 6 25 vhcurveto + 74 18 54 36 54 hhcurveto + 132 -206 rmoveto + -83 -23 -110 -108 -28 -23 8 14 -18 vhcurveto + 150 345 rlineto + 41 -42 9 -76 -56 vvcurveto + endchar + + + -8 267 620 -103 callsubr + 117 -540 -99 callsubr + + + 17 203 -206 rmoveto + -6 52 -3 97 -1 46 10 8 rcurveline + -5 19 20 -3 20 hhcurveto + 155 105 162 147 75 -35 92 -102 -69 -61 -31 -43 -54 hvcurveto + -8 4 rlineto + 44 -4 -16 31 -45 -50 callsubr + 303 rmoveto + 1 -2 103 82 11 3 76 -43 callsubr + + + -92 294 13 rmoveto + 62 -19 7 7 rlineto + -2 140 -5 141 141 vvcurveto + 59 2 59 3 59 vhcurveto + 3 40 33 9 38 5 rrcurveto + 18 vlineto + -7 7 -150 3 -148 3 -95 -95 -6 -106 rlinecurve + -4 -84 52 -97 128 -10 rrcurveto + 29 -2 67 2 -19 vvcurveto + -25 -6 -135 -1 -101 vhcurveto + endchar + + + -288 246 -163 rmoveto + -129 25 -7 243 169 vvcurveto + 151 9 254 127 32 vhcurveto + 27 vlineto + -104 -18 -45 -114 -19 -96 rrcurveto + -15 -75 -5 -78 -77 vvcurveto + -81 4 -81 14 -80 vhcurveto + 17 -95 48 -121 105 -9 rrcurveto + endchar + + + -286 11 709 rmoveto + 81 -29 23 -94 15 -75 rrcurveto + 15 -77 4 -80 -78 vvcurveto + -114 2 -122 -36 -107 vhcurveto + -20 -60 -38 -26 -46 -12 rrcurveto + -24 vlineto + 179 23 11 267 171 vvcurveto + 167 -21 262 -169 35 vhcurveto + endchar + + + 22 100 548 rmoveto + 48 21 34 46 64 hhcurveto + 93 52 -94 -100 25 hvcurveto + -4 -4 rlineto + 10 -36 -23 3 -21 hhcurveto + -153 -74 -125 -129 -47 13 -71 34 -41 hvcurveto + -42 35 53 -9 58 hhcurveto + 42 41 18 28 33 hvcurveto + 82 69 15 113 101 vvcurveto + 158 -53 219 -175 -90 -56 -62 -82 -28 vhcurveto + 300 -430 rmoveto + -45 -15 -30 -47 -53 hhcurveto + -99 -23 124 48 91 37 129 117 27 27 -9 -11 25 hvcurveto + 8 -39 4 -40 -40 vvcurveto + -54 -7 -56 -18 -51 vhcurveto + endchar + + + 282 228 795 -40 callsubr + 475 -18 rmoveto + -11 hlineto + -616 -746 -1 -14 28 -18 621 754 -1 13 rlineto + -545 -23 rmoveto + 85 -6 57 -67 -72 vvcurveto + -50 -14 -61 -72 -74 -41 74 63 45 14 48 45 26 vhcurveto + 446 -401 -40 callsubr + -50 -52 rmoveto + 85 -6 57 -67 -72 vvcurveto + -50 -14 -61 -72 -74 -41 74 63 45 14 48 45 26 vhcurveto + endchar + + + -273 69 52 -35 callsubr + + + -273 69 257 -35 callsubr + + + 99 365 -156 rmoveto + -7 49 -4 50 49 vvcurveto + 9 10 70 2 67 21 50 50 rlinecurve + 48 48 21 69 67 vvcurveto + 124 -70 90 -185 vhcurveto + -8 10 rlineto + 68 3 68 5 67 vhcurveto + -7 8 -82 -42 rlineto + 4 -56 2 -57 -57 vvcurveto + -9 -9 rlineto + -42 -83 -21 -47 -47 hvcurveto + -50 -51 -24 -70 -72 vvcurveto + -115 50 -96 197 -5 vhcurveto + 8 -9 rlineto + -57 -4 -55 -1 -57 vhcurveto + 17 -10 rlineto + 61 234 rmoveto + 392 vlineto + 9 9 47 -1 46 -7 34 -34 rlinecurve + 36 -37 11 -52 -51 vvcurveto + -105 -62 -116 -113 -7 vhcurveto + -81 400 rmoveto + -395 vlineto + -8 -9 rlineto + -110 -54 114 99 56 12 59 41 41 hvcurveto + 30 30 49 13 31 hhcurveto + endchar + + + 97 265 -197 rmoveto + 69 21 rlineto + -5 54 -3 53 54 vvcurveto + 7 8 81 11 77 28 58 58 rlinecurve + 49 49 19 69 69 vvcurveto + 96 -50 91 -111 -42 -51 -11 -37 -43 vhcurveto + -58 -50 -8 -65 -61 vvcurveto + -205 vlineto + -7 -7 rlineto + -19 -27 9 37 -37 hvcurveto + -48 47 -13 79 67 vvcurveto + 81 31 58 84 39 vhcurveto + -12 22 rlineto + -99 -29 -84 -83 -106 vvcurveto + -69 18 -60 45 -52 vhcurveto + 52 -60 50 -10 59 -6 7 -7 rcurveline + -2 -168 rlineto + 74 216 rmoveto + 232 vlineto + 91 29 69 82 82 15 -120 -28 -66 -15 -74 -45 -46 vhcurveto + -38 -39 -49 -24 -54 -2 rrcurveto + endchar + + + 51 171 460 rmoveto + -58 -61 -1 -58 -18 hvcurveto + -28 -113 21 -9 18 46 rlineto + 59 23 26 10 49 hhcurveto + 74 hlineto + -25 -112 -54 -143 -67 -116 1 -13 rcurveline + 55 -15 11 10 44 128 45 131 27 130 rlinecurve + 143 hlineto + 6 -6 rlineto + -10 -80 -6 -80 -81 vvcurveto + -45 2 -63 29 -27 vhcurveto + -12 12 22 0 19 hhcurveto + 41 41 32 28 31 hvcurveto + -10 17 -6 2 rlineto + -10 -15 -16 -6 -18 hhcurveto + -65 2 129 90 34 4 36 2 35 hvcurveto + 7 7 38 1 37 11 34 16 rlinecurve + 35 59 -8 7 rlineto + -18 -34 -38 -10 -39 hhcurveto + endchar + + + 230 356 302 rmoveto + 2 -22 3 -22 -22 vvcurveto + -81 -26 -108 -104 -83 -29 104 73 53 17 52 38 37 vhcurveto + -10 21 rlineto + -74 -51 -50 -58 -84 vvcurveto + -88 38 -114 105 73 63 39 53 49 vhcurveto + 8 -1 rlineto + -58 20 49 -37 58 hhcurveto + 134 112 176 142 161 -141 74 -207 -155 -63 -26 -26 -42 hvcurveto + -45 -28 -30 -37 -33 -39 15 -16 rcurveline + 68 68 46 40 200 hhcurveto + 87 110 -9 -61 59 hvcurveto + 51 -54 13 -46 -58 vvcurveto + -84 -38 -109 -97 -57 -45 45 63 vhcurveto + 154 vlineto + -8 12 rlineto + endchar + + + 202 392 -26 callsubr + -310 hlineto + 40 7 rlineto + 303 308 vlineto + 5 40 rlineto + -313 hlineto + endchar + + + 218 399 -26 callsubr + -271 -303 -97 callsubr + 658 hlineto + 6 40 rlineto + -314 271 308 hlineto + 5 40 rlineto + -313 hlineto + endchar + + + 159 358 -189 rmoveto + 76 35 rlineto + -7 49 -2 51 50 vvcurveto + 7 8 rlineto + 139 29 108 114 139 vvcurveto + 66 -25 64 -41 51 vhcurveto + -21 3 -44 -48 -3 -13 rlineto + 36 -39 27 -49 -54 vvcurveto + -56 -11 -53 -36 -44 vhcurveto + -14 -18 -53 -54 -63 -5 -6 7 rcurveline + 352 vlineto + 98 0 164 2 30 vhcurveto + -7 7 -80 -33 rlineto + 6 -101 6 -108 -96 vvcurveto + -315 vlineto + -7 -6 rlineto + -44 -51 23 21 -22 hvcurveto + -29 28 -12 41 80 vvcurveto + 129 vlineto + 116 -35 -2 -29 -47 -49 -35 -31 -39 vhcurveto + 17 -21 rlineto + 13 20 25 17 19 hhcurveto + 38 6 -60 -30 hvcurveto + -153 vlineto + -106 42 -64 190 vhcurveto + 7 -8 rlineto + -176 vlineto + endchar + + + -37 451 -214 rmoveto + -8 89 -4 116 122 vvcurveto + 132 4 139 10 116 vhcurveto + -21 4 -44 -59 -9 -2 rlineto + 14 -28 -40 14 -31 hhcurveto + -169 -71 -146 -139 -84 38 -109 105 63 58 28 38 51 hvcurveto + 7 -5 -3 -96 -2 -144 -3 -41 rlinecurve + 16 -16 rlineto + -8 348 rmoveto + -29 -33 -44 -21 -39 hhcurveto + -82 -32 75 83 112 34 109 113 26 23 -14 -18 18 hvcurveto + 16 -16 0 -30 -25 vvcurveto + endchar + + + -192 162 222 rmoveto + -16 12 -11 20 20 vvcurveto + 62 122 61 47 79 vhcurveto + 17 29 13 27 33 vvcurveto + 77 -53 51 -76 -79 -105 -53 -83 -26 10 -27 18 -16 vhcurveto + 67 40 rlineto + -19 15 -13 22 24 vvcurveto + 45 42 27 39 50 48 -62 -54 -113 -99 -44 -64 -83 vhcurveto + -13 -16 -13 -19 -20 vvcurveto + -30 19 -27 23 -14 vhcurveto + 46 32 rlineto + -80 -165 rmoveto + -31 25 -26 31 32 26 26 31 31 -26 26 -32 -31 -25 -26 -31 vhcurveto + endchar + + + -192 271 442 rmoveto + 31 -25 26 -31 -32 -26 -26 -31 -31 26 -26 32 31 25 26 31 vhcurveto + -80 -176 rmoveto + 16 -12 11 -20 -20 vvcurveto + -62 -122 -61 -47 -79 vhcurveto + -17 -29 -13 -27 -33 vvcurveto + -77 53 -51 76 79 105 53 83 26 -10 27 -18 16 vhcurveto + -67 -40 rlineto + 19 -15 13 -22 -24 vvcurveto + -45 -42 -27 -39 -50 -48 62 54 113 99 44 64 83 vhcurveto + 13 16 13 19 20 vvcurveto + 30 -19 27 -23 14 vhcurveto + -46 -32 rlineto + endchar + + + -212 118 432 rmoveto + 21 191 rlineto + 52 vlineto + 14 -19 6 -14 -25 -9 -17 -21 -24 2 -25 3 -24 vhcurveto + 20 -152 rlineto + 142 hmoveto + 19 194 rlineto + 1 15 0 16 16 vvcurveto + 13 -18 6 -11 -18 -21 -5 -19 -5 3 -24 2 -14 vhcurveto + 22 -193 rlineto + endchar + + + -345 115 532 rmoveto + -9 14 -5 15 16 vvcurveto + 35 28 47 21 36 vhcurveto + -14 14 rlineto + -39 -49 -56 -68 -51 vvcurveto + -48 44 -87 30 15 33 24 18 8 -11 19 -5 8 vhcurveto + endchar + + + -348 66 395 rmoveto + 35 53 54 54 62 vvcurveto + 42 -43 89 -28 -16 -32 -26 -15 -7 8 -16 6 -10 vhcurveto + 35 -57 rlineto + 7 -13 6 -12 -14 vvcurveto + -40 -24 -38 -24 -41 vhcurveto + endchar + + + -335 110 436 rmoveto + 26 186 rlineto + 2 13 2 16 11 vvcurveto + 19 -9 14 -21 -19 -17 -10 -19 -13 1 -12 1 -12 vhcurveto + 18 -193 rlineto + endchar + + + -129 406 388 rmoveto + 52 -5 -25 27 -49 hhcurveto + -36 -45 -42 -28 -29 hvcurveto + -10 4 rlineto + 42 -6 -21 30 -45 hhcurveto + -41 -55 -44 -31 -39 hvcurveto + 12 -17 rlineto + 14 25 30 17 23 hhcurveto + 46 -3 -91 -78 -80 -6 -87 -6 -70 hvcurveto + 15 -9 70 21 rlineto + -2 51 -1 50 51 vvcurveto + 54 -7 83 14 33 vhcurveto + 27 11 25 35 41 hhcurveto + 33 15 -30 -28 5 hvcurveto + 12 -5 rlineto + endchar + + + 87 -68 callsubr + 257 -1 rmoveto + 72 6 57 28 70 vvcurveto + 48 -52 22 -70 vhcurveto + -162 hlineto + -4 -4 -1 -8 rlineto + 5 41 -6 -16 hvcurveto + -28 2 -50 -8 vvcurveto + -72 0 -74 -5 -72 vhcurveto + 6 -5 50 15 rlineto + -3 48 0 48 48 vvcurveto + 4 4 -2 -2 4 hvcurveto + 18 -14 75 -82 56 -60 60 13 rcurveline + 5 vlineto + -158 148 rlineto + -64 23 rmoveto + 2 2 88 2 32 vhcurveto + 10 2 3 5 vhcurveto + 24 hlineto + 44 57 -8 -50 -60 -64 -24 -66 -4 -2 4 3 hvcurveto + endchar + + + -61 133 -169 rmoveto + 2 4 4 8 1 vvcurveto + -20 78 -4 72 -3 80 7 1 rcurveline + -50 33 45 -28 54 hhcurveto + 120 84 136 118 58 -9 74 -40 40 hvcurveto + 36 -37 -47 18 -51 hhcurveto + -54 -57 -16 -36 -41 hvcurveto + -76 -67 3 -105 -120 vvcurveto + -105 5 -105 6 -104 vhcurveto + 20 -8 rlineto + 40 420 rmoveto + 90 28 120 111 91 20 -117 -90 -87 -41 -100 -104 -84 -21 107 77 vhcurveto + endchar + + + -45 153 -83 callsubr + + + -545 -97 -83 callsubr + + + -166 342 383 rmoveto + 61 -3 -58 22 -52 hhcurveto + -83 -90 -53 -90 -66 62 -36 63 -26 hvcurveto + 47 -20 52 -27 -51 vvcurveto + -41 -43 -35 -42 -63 -47 53 62 -4 vhcurveto + -14 1 -49 -71 rlineto + -63 33 54 -20 60 hhcurveto + 88 100 53 102 47 -38 36 -77 33 hvcurveto + -73 31 -37 25 40 vvcurveto + 46 35 35 47 45 17 -34 -44 3 vhcurveto + 12 -7 rlineto + endchar + + + -80 35 23 rmoveto + -99 9 91 -31 81 hhcurveto + 99 81 83 99 26 -5 27 -13 21 hvcurveto + 33 37 19 48 51 vvcurveto + 86 -87 24 -63 36 vhcurveto + -75 43 -60 13 74 vvcurveto + 58 32 52 51 44 24 -36 -60 vhcurveto + 15 -11 59 21 rlineto + 2 12 4 18 7 vvcurveto + 61 -69 18 -49 -102 -68 -79 -97 -21 4 -20 6 -20 vhcurveto + -26 -38 -22 -42 -46 vvcurveto + -86 58 -38 86 -38 vhcurveto + 82 -40 60 -26 -62 vvcurveto + -69 -43 -60 -62 -71 -45 58 68 -2 vhcurveto + -8 5 rlineto + 259 116 rmoveto + -64 66 -211 33 108 vvcurveto + 24 10 27 14 18 vhcurveto + 41 -56 144 -28 51 -53 rrcurveto + 20 -20 16 -24 -29 vvcurveto + -22 -5 -22 -13 -18 vhcurveto + endchar + + + -352 29 400 -88 callsubr + 41 -590 rmoveto + 40 49 50 58 61 vvcurveto + 39 -36 82 -35 -12 -11 -4 -7 -9 vhcurveto + -2 -2 rlineto + -8 -8 -1 -15 -12 vvcurveto + -9 4 -9 5 -8 vhcurveto + 34 -51 rlineto + 7 -12 6 -12 -14 vvcurveto + -36 -23 -45 -24 -32 vhcurveto + endchar + + + -45 494 686 rmoveto + -208 hlineto + -45 -153 2 6 -18 hvcurveto + -21 -79 7 -9 rlineto + 336 hlineto + 6 -12 rlineto + -62 -99 -98 -171 0 vvcurveto + -54 -92 -85 -150 -24 -82 6 -8 rcurveline + 84 20 32 146 65 136 78 128 rlinecurve + 154 252 rlineto + endchar + + + 353 404 -60 callsubr + + + 353 679 -60 callsubr + + + -2 210 462 rmoveto + -126 -5 -53 -118 -118 vvcurveto + -109 46 -117 129 145 87 101 132 83 -35 70 -67 45 vhcurveto + 1 6 66 -8 69 -8 64 -13 rlinecurve + 7 6 14 57 -5 10 rlineto + -323 -47 rmoveto + 104 26 -122 -91 -69 -20 -111 -96 -60 -40 66 48 -15 hvcurveto + -11 34 -3 34 35 vvcurveto + 74 27 102 88 vhcurveto + endchar + + + -45 471 688 rmoveto + 6 -15 -25 6 -15 hhcurveto + -89 -86 -59 -65 -62 hvcurveto + -89 -89 -45 -124 -125 vvcurveto + -114 50 -137 141 120 115 107 117 85 -59 81 -91 -69 -63 -29 -43 -53 vhcurveto + -7 1 1 96 19 101 79 73 rlinecurve + 38 41 54 27 61 hhcurveto + 20 18 -3 -8 20 hvcurveto + 9 4 rlineto + -319 -369 rmoveto + 21 22 61 28 41 hhcurveto + 79 57 -68 -74 -76 -44 -64 -85 -106 -25 142 91 hvcurveto + endchar + + + 338 413 -71 callsubr + + + 338 688 -71 callsubr + + + -155 380 720 rmoveto + -11 -2 -386 -888 3 -14 32 -8 389 896 -5 11 rlineto + endchar + + + -545 endchar + + + -212 endchar + + + 104 301 134 rmoveto + 0 -50 36 -80 vhcurveto + -3 6 31 16 49 50 17 61 rlinecurve + 2 5 1 4 2 5 59 -1 36 -1 89 -3 4 48 rcurveline + -178 -6 rlineto + 134 32 -4 163 108 hhcurveto + 35 28 -29 -32 -37 13 -7 23 hvcurveto + 0 46 1 60 vvcurveto + 55 -50 23 -51 -142 -78 -109 -173 -22 vhcurveto + -2 -15 -3 -17 -3 -18 -36 3 -27 1 -43 1 -8 -45 rcurveline + 35 1 36 1 35 1 -11 -50 -17 -48 -20 -19 -31 -31 -41 -15 -22 -37 -23 -39 -12 -33 -3 -33 20 -17 rcurveline + 46 15 24 75 67 hhcurveto + 26 52 -21 -43 66 hvcurveto + -29 36 59 -29 81 hhcurveto + 43 25 25 30 29 hvcurveto + 39 41 5 57 56 vvcurveto + 11 -1 30 -4 17 vhcurveto + -24 -5 rlineto + 2 -14 2 -24 -17 vvcurveto + -67 -36 -61 -63 -44 -86 25 37 -54 vhcurveto + endchar + + + -160 121 582 rmoveto + 2 -26 0 -64 -51 vvcurveto + -6 -6 rlineto + -104 hlineto + -6 -6 -7 -24 5 -5 rlineto + 112 hlineto + 6 -7 rlineto + -190 vlineto + -135 2 -19 21 -27 vhcurveto + -24 18 31 -7 23 hhcurveto + 58 60 45 43 46 hvcurveto + -7 15 -12 2 rlineto + -19 -30 -36 -22 -25 hhcurveto + -63 -8 79 71 hvcurveto + 189 vlineto + 6 6 rlineto + 119 hlineto + 6 5 8 26 -5 4 rlineto + -128 hlineto + -6 5 1 58 5 51 5 57 rlinecurve + -7 5 rlineto + endchar + + + -59 130 461 rmoveto + -29 -39 -5 -30 -20 hvcurveto + -13 -20 -22 -102 -4 -19 22 -3 rcurveline + 13 34 17 46 13 14 rrcurveto + 20 20 37 2 28 hhcurveto + 75 hlineto + 7 -7 rlineto + -7 -83 -8 -83 -83 vvcurveto + -63 10 -88 68 43 53 38 37 39 vhcurveto + -9 14 -9 2 rlineto + -10 -16 -26 -15 -19 hhcurveto + -62 1 134 34 54 9 77 2 34 hvcurveto + 9 8 rlineto + 68 hlineto + 28 28 4 6 27 hvcurveto + 43 67 -13 9 rlineto + -16 -34 -38 -7 -38 hhcurveto + endchar + + + -45 214 -11 rmoveto + 109 91 99 103 32 hvcurveto + 18 56 5 61 60 vvcurveto + 134 -16 193 -153 -115 -89 -82 -108 -34 vhcurveto + -19 -58 -1 -62 -60 vvcurveto + -135 19 -201 153 vhcurveto + -95 388 rmoveto + 94 11 177 125 118 5 -167 -104 6 vhcurveto + -5 -7 rlineto + -254 hlineto + 264 -45 rmoveto + -85 -4 -109 -47 -48 vhcurveto + -19 -19 -21 -17 -27 hhcurveto + -125 -27 168 111 hvcurveto + 7 7 rlineto + 255 hlineto + endchar + + + -19 114 118 rmoveto + -76 31 -56 73 104 91 94 100 35 vhcurveto + 17 50 7 47 53 vvcurveto + 4 4 rlineto + 52 27 -53 -86 callsubr + 99 -20 116 -76 76 vhcurveto + 24 -24 -32 16 -34 hhcurveto + -84 -65 -63 -84 -135 129 -72 132 -13 hvcurveto + 4 -5 rlineto + -103 -19 -189 -125 -56 -13 37 118 vhcurveto + 108 vlineto + 39 -19 36 -39 -50 -52 -35 -33 -38 vhcurveto + 11 -20 rlineto + 13 22 25 15 22 hhcurveto + 40 4 -48 -36 hvcurveto + 278 137 rmoveto + -111 10 -103 87 115 vvcurveto + 43 33 39 44 61 40 -80 -58 19 vhcurveto + 16 -49 6 -50 -52 vvcurveto + endchar + + + -2 199 -206 rmoveto + -5 52 0 13 -2 46 10 8 rcurveline + -5 19 17 -3 20 hhcurveto + 155 105 162 147 75 -35 92 -102 -69 -59 -31 -43 -54 hvcurveto + -8 4 rlineto + 10 0 28 -1 31 vhcurveto + 69 -2 -28 21 -36 -50 callsubr + 219 rmoveto + 1 -1 81 82 11 2 98 -43 callsubr + + + -45 241 382 rmoveto + 87 25 71 65 96 vvcurveto + 87 -65 47 -81 -62 -68 -51 -43 -51 vhcurveto + 14 -22 rlineto + 24 37 46 29 39 hhcurveto + 60 49 -37 -62 -90 -70 -51 -121 -28 hvcurveto + -1 -26 rlineto + 60 79 -4 -41 39 hvcurveto + 29 -31 20 -40 -43 vvcurveto + -86 -56 -77 -90 -61 -45 47 51 -30 vhcurveto + -10 hlineto + -42 -72 7 -11 rlineto + -35 45 54 -20 57 hhcurveto + 133 132 95 137 100 -78 48 -127 11 hvcurveto + endchar + + + 182 229 -70 callsubr + + + 182 504 -70 callsubr + + + 245 633 -90 callsubr + -475 -188 rmoveto + 62 15 52 39 58 vvcurveto + 53 -49 27 -56 -46 -48 -31 -25 -37 vhcurveto + 10 -13 rlineto + 14 27 32 17 29 hhcurveto + 41 37 -20 -39 -55 -51 -29 -86 -17 hvcurveto + -1 -16 rlineto + 43 58 -2 -25 28 hvcurveto + 20 -18 15 -25 -25 vvcurveto + -52 -40 -46 -65 -43 -33 28 31 -22 vhcurveto + -7 hlineto + -30 -44 4 -6 rlineto + -21 32 40 -12 41 hhcurveto + 96 94 57 82 59 -53 29 -94 7 hvcurveto + 435 -103 -74 callsubr + + + -246 144 518 rmoveto + 64 16 52 43 62 vvcurveto + 58 -50 29 -57 -46 -49 -32 -29 -38 vhcurveto + 10 -14 rlineto + 16 28 33 18 29 hhcurveto + 45 35 -24 -40 -59 -53 -33 -88 -18 hvcurveto + -17 vlineto + 44 57 -2 -27 29 hvcurveto + 21 -20 16 -26 -28 vvcurveto + -57 -42 -49 -65 -44 -32 30 34 -24 vhcurveto + -8 hlineto + -31 -47 5 -7 rlineto + -23 33 40 -13 42 hhcurveto + 96 99 61 90 67 -61 29 -90 7 hvcurveto + endchar + + + -45 249 620 -103 callsubr + endchar + + + -545 -2 620 -103 callsubr + endchar + + + -45 467 88 rmoveto + -309 hlineto + -5 -8 1 6 2 1 1 1 1 hvcurveto + 84 98 88 101 59 107 rrcurveto + 26 46 22 48 54 vvcurveto + 87 -63 68 -88 -84 -73 -53 -60 -54 vhcurveto + 20 -19 rlineto + 32 38 44 32 55 hhcurveto + 85 28 -80 -52 -119 -78 -101 -78 -91 hvcurveto + -53 -62 -56 -59 -57 -58 rrcurveto + -16 437 vlineto + 23 78 rlineto + endchar + + + 338 48 -66 callsubr + + + 338 323 -66 callsubr + + + -241 308 327 rmoveto + -227 hlineto + -5 -4 1 4 1 0 0 1 1 hvcurveto + 88 90 117 114 91 vvcurveto + 58 -48 43 -63 -61 -54 -34 -39 -40 vhcurveto + 14 -13 rlineto + 21 28 34 21 40 hhcurveto + 60 22 -50 -36 -78 -57 -65 -57 -59 hvcurveto + -39 -40 -41 -38 -42 -38 rrcurveto + -11 321 vlineto + 17 51 rlineto + endchar + + + 93 627 107 -94 callsubr + + + 88 442 704 -104 callsubr + 347 -443 -94 callsubr + + + 88 154 561 -106 callsubr + 304 -635 -94 callsubr + + + 88 477 606 -107 callsubr + 352 -499 -94 callsubr + + + 88 187 705 -105 callsubr + 393 -634 -94 callsubr + + + 211 756 -74 rmoveto + -756 -40 756 hlineto + endchar + + + -2 387 398 rmoveto + 39 -38 18 -53 -54 vvcurveto + -76 -35 -126 -129 -67 -27 58 72 vhcurveto + 69 5 60 66 vvcurveto + 46 -10 50 -56 -50 -49 -37 -34 -38 vhcurveto + 16 -22 rlineto + 17 21 24 18 26 hhcurveto + 30 8 -43 -41 hvcurveto + -211 vlineto + -65 27 -66 81 156 142 152 156 66 -29 61 -45 48 vhcurveto + -20 -4 -42 -51 rlineto + endchar + + + -52 363 425 rmoveto + -2 -2 -2 -3 -3 vvcurveto + -2 0 -2 1 -1 vhcurveto + 17 -32 20 -36 -32 vvcurveto + -71 -57 -78 -50 -59 vhcurveto + -8 -8 -11 -14 -5 hhcurveto + -21 -32 151 60 -15 hvcurveto + 107 -28 -14 69 -51 hhcurveto + -39 -50 -33 -25 -36 hvcurveto + 9 -24 rlineto + 13 23 18 8 22 hhcurveto + 31 24 -76 -85 23 hvcurveto + 69 -258 rlineto + 24 hlineto + 5 3 14 14 11 11 59 60 55 63 45 72 rrcurveto + 28 45 27 50 55 vvcurveto + 58 -27 42 -19 -2 -3 0 -2 -3 vhcurveto + endchar + + + 256 668 416 rmoveto + 18 -31 20 -40 -33 vvcurveto + -81 -63 -76 -51 -64 vhcurveto + -4 -3 -8 -6 -4 hhcurveto + -8 -7 8 7 -3 hvcurveto + -44 118 -27 124 -26 126 -12 3 rcurveline + -52 -26 -52 -106 -57 -104 -57 -103 rlinecurve + -11 2 -10 81 -4 82 -15 80 rlinecurve + 41 -8 -16 55 -54 hhcurveto + -41 -54 -40 -28 -39 hvcurveto + 9 -20 rlineto + 14 27 33 17 23 hhcurveto + 10 34 1 -191 21 hvcurveto + 24 -224 7 -6 42 13 55 119 68 128 56 103 rlinecurve + 3 1 6 2 4 hhcurveto + 5 2 -6 -4 2 hvcurveto + 29 -114 45 -175 17 -48 rrcurveto + -9 3 12 -12 11 hhcurveto + 13 12 11 10 10 hvcurveto + 58 63 55 66 45 74 rrcurveto + 28 47 28 51 55 vvcurveto + 24 -18 72 -25 -3 -2 0 -1 -1 vhcurveto + -57 -35 rlineto + -2 -1 0 -3 -3 vvcurveto + -2 0 -2 1 -2 vhcurveto + endchar + + + 46 182 464 rmoveto + -51 -37 -42 -55 -66 vvcurveto + -43 21 -42 20 -37 vhcurveto + -28 -52 -58 -121 -76 vvcurveto + -61 31 -70 75 92 42 100 82 15 -2 14 -4 15 vhcurveto + -21 20 27 -15 30 hhcurveto + 37 39 29 28 28 hvcurveto + 66 66 25 97 92 vvcurveto + 72 -21 94 -99 -118 -79 -119 -62 -39 vhcurveto + -18 -26 rlineto + -9 hlineto + -11 22 -11 28 27 vvcurveto + 43 25 36 26 33 vhcurveto + 73 -395 rmoveto + -19 56 -31 59 -30 53 40 62 63 92 39 16 rrcurveto + 11 28 10 2 19 hhcurveto + 80 22 -94 -65 -92 -23 -110 -88 -27 -20 17 35 -9 hvcurveto + -7 1 rlineto + -162 42 rmoveto + 38 -60 51 -75 -60 vvcurveto + -45 -19 -52 -58 -56 -16 71 47 50 21 72 30 52 vhcurveto + endchar + + + -55 410 462 rmoveto + 2 -2 -2 0 -2 hhcurveto + -3 -2 0 -2 -1 hvcurveto + -44 -51 -59 -70 -36 -48 -6 1 rcurveline + -29 56 -41 72 -21 23 rrcurveto + 15 -14 -23 4 -17 hhcurveto + -33 -50 -37 -27 -35 hvcurveto + 14 -18 rlineto + 12 18 25 13 21 hhcurveto + 49 48 -107 -77 38 hvcurveto + -49 -64 -50 -69 -43 -69 rrcurveto + -8 vlineto + 28 -25 16 4 30 77 40 62 39 60 rlinecurve + 7 hlineto + -129 66 34 -74 51 hhcurveto + 42 51 56 38 35 hvcurveto + -8 19 rlineto + -8 hlineto + -17 -20 -27 -21 -24 hhcurveto + -44 -59 106 90 -41 hvcurveto + 52 61 64 65 56 39 rrcurveto + 2 1 1 1 3 vvcurveto + 1 -2 2 -1 1 vhcurveto + endchar + + + -73 411 -137 rmoveto + 32 43 42 54 47 vvcurveto + 42 -55 9 -32 vhcurveto + -40 -84 -11 -56 hhcurveto + -66 -53 39 69 132 122 48 108 hvcurveto + 23 vlineto + -74 8 -86 21 91 vvcurveto + 110 112 34 87 10 vhcurveto + 28 vlineto + -6 -32 -35 -5 -31 hhcurveto + -50 -51 13 32 -39 hvcurveto + -8 hlineto + -28 -46 41 -22 47 -5 44 -1 rlinecurve + 1 -8 rlineto + -68 -27 -68 -55 -79 vvcurveto + -70 57 -24 51 -11 vhcurveto + -6 vlineto + -94 -29 -91 -77 -108 vvcurveto + -81 62 -53 83 vhcurveto + 28 106 16 52 hhcurveto + 34 45 -9 -42 -24 -19 -30 -15 -25 hvcurveto + endchar + + + 27 104 -182 -85 callsubr + + + 7 441 699 -104 callsubr + -175 -727 -85 callsubr + + + 7 456 605 -107 callsubr + -150 -787 -85 callsubr + + + 78 250 299 rmoveto + -21 0 -20 -21 vvcurveto + -149 -97 callsubr + 156 hlineto + -66 -1 -67 -2 -66 vhcurveto + 11 -9 90 29 -6 179 rlineto + 166 hlineto + 6 40 rlineto + -173 hlineto + -2 69 5 8 5 7 5 8 rlinecurve + 152 hlineto + 6 40 rlineto + -131 hlineto + 67 99 67 87 92 120 -4 18 rcurveline + -84 callsubr + 114 -225 rcurveline + -116 -97 callsubr + 143 hlineto + endchar + + + -82 402 462 rmoveto + -17 -21 -23 -14 -29 -56 -68 31 -51 hhcurveto + -29 -13 -10 -31 -20 hvcurveto + -50 -89 20 -13 rlineto + 43 31 21 28 37 36 51 -19 33 hhcurveto + 11 9 0 2 10 hvcurveto + -295 -381 15 -19 rlineto + 6 hlineto + 23 16 22 20 24 hhcurveto + 117 -11 43 -4 75 -10 11 1 rlinecurve + 50 -1 27 28 20 40 41 80 rcurveline + -22 12 rlineto + -36 -23 -29 -42 -57 hhcurveto + -9 -98 3 10 -98 hvcurveto + -5 8 99 134 108 133 83 88 rlinecurve + -14 13 rlineto + endchar + + + -45 290 704 rmoveto + -44 -18 -49 -24 -33 -33 rrcurveto + -85 -85 -45 -121 -120 vvcurveto + -115 28 -202 145 184 69 211 159 133 -49 138 -121 77 vhcurveto + -56 -64 rmoveto + 45 -19 44 -70 7 -12 rrcurveto + 44 -79 24 -85 -90 vvcurveto + -97 -24 -136 -122 -64 -46 79 68 -20 vhcurveto + -16 55 -5 59 58 vvcurveto + 101 45 113 88 55 vhcurveto + endchar + + + 215 422 -67 callsubr + + + 215 697 -67 callsubr + + + -124 363 -136 rmoveto + 32 40 40 54 48 vvcurveto + 36 -39 11 -41 vhcurveto + -24 -37 -6 -40 hhcurveto + -104 -45 80 83 181 148 196 155 49 hvcurveto + 19 vlineto + -5 -34 -29 -3 -26 hhcurveto + -55 -42 12 32 -48 hvcurveto + 4 -7 1 0 -2 hhcurveto + -2 -1 0 -1 -2 hvcurveto + -28 -35 rlineto + -2 -2 0 -1 -1 vvcurveto + 18 -17 26 -6 25 -4 91 -8 rcurveline + 1 -7 rlineto + -130 -109 -134 -171 -159 vvcurveto + -93 38 -91 124 vhcurveto + 26 68 9 41 hhcurveto + 22 29 -14 -24 -26 -19 -32 -15 -27 hvcurveto + endchar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/merge/data/CFFFont_expected.ttx b/Tests/merge/data/CFFFont_expected.ttx new file mode 100644 index 00000000..6e0acc22 --- /dev/null +++ b/Tests/merge/data/CFFFont_expected.ttx @@ -0,0 +1,30063 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copyright 2015-2021 The Aref Ruqaa Project Authors (https://github.com/aliftype/aref-ruqaa), with Reserved Font Name EURM10. + + + Aref Ruqaa + + + Regular + + + 1.003;ALIF;ArefRuqaa-Regular + + + Aref Ruqaa Regular + + + Version 1.003 + + + ArefRuqaa-Regular + + + Abdullah Aref + + + Aref Ruqaa is an Arabic typeface that aspires to capture the essence of the classical Ruqaa calligraphic style. + + + This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFL + + + https://scripts.sil.org/OFL + + + الحب سماء لا تمطر غير الأحلام + + + Looped Haa + + + Open final Haa + + + Tailed Noon + + + Looped initial Kaf + + + Alternate Arabic digit two + + + Tailed Sheen + + + Alternate Sad-Tah/Tah-Sad + + + Alternate Sukun + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 136 50 -200 rmoveto + 400 1000 -400 -1000 hlineto + 50 50 rmoveto + 900 300 -900 -300 vlineto + endchar + + + -45 50 -200 rmoveto + 400 1000 -400 -1000 hlineto + 50 50 rmoveto + 900 300 -900 -300 vlineto + endchar + + + 177 572 -10 rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 160 -15 83 rrcurveto + -194 -27 hlineto + 90 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -115 -204 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + -206 586 rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 1 3 3 3 vhcurveto + endchar + + + 252 366 66 rmoveto + -27 6 -28 20 -11 vhcurveto + 388 hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + 6 48 -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + -194 -27 hlineto + 91 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -116 -206 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 142 hlineto + 39 vmoveto + -116 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 2 5 4 0 -9 vvcurveto + endchar + + + 177 517 882 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 217 -738 rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 160 -15 83 rrcurveto + -194 -27 hlineto + 90 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -115 -204 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + -206 586 rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 1 3 3 3 vhcurveto + endchar + + + 177 189 729 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + 214 -920 rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 160 -15 83 rrcurveto + -194 -27 hlineto + 90 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -115 -204 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + -206 586 rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 1 3 3 3 vhcurveto + endchar + + + 177 512 813 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 262 -823 rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 160 -15 83 rrcurveto + -194 -27 hlineto + 90 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -115 -204 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + -206 586 rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 1 3 3 3 vhcurveto + endchar + + + 177 222 883 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 303 -929 rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 160 -15 83 rrcurveto + -194 -27 hlineto + 90 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -115 -204 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + -206 586 rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 1 3 3 3 vhcurveto + endchar + + + 177 572 -10 rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 159 -15 83 rrcurveto + 21 18 13 26 30 vvcurveto + 54 -43 43 -54 -54 -43 -43 -54 -29 13 -26 20 -18 vhcurveto + -67 -27 hlineto + 90 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -115 -204 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + -267 763 rmoveto + 37 30 30 37 37 30 -30 -37 -37 -30 -30 -37 -37 -30 30 37 vhcurveto + 61 -177 rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 1 3 3 3 vhcurveto + endchar + + + 177 350 838 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + 175 -827 rmoveto + 15 15 2 4 15 hvcurveto + 104 30 -1 26 rlineto + -1 -14 -15 -2 -14 hhcurveto + -27 -24 8 22 -13 hvcurveto + -36 60 -27 97 -22 81 -33 120 -45 160 -15 83 rrcurveto + -194 -27 hlineto + 90 -15 rlineto + 9 -2 3 -6 -3 vvcurveto + -3 0 -1 -1 -3 vhcurveto + -105 -208 -115 -204 -119 -200 3 -10 rcurveline + 91 19 117 248 rlineto + 4 2 4 4 4 hhcurveto + 225 hlineto + 3 6 -5 -4 2 hvcurveto + 54 -188 rlineto + -44 12 13 -42 33 hhcurveto + -206 586 rmoveto + 3 3 -2 -2 1 hvcurveto + 70 -244 rlineto + -1 2 -8 0 vhcurveto + -3 -2 -4 -5 vhcurveto + -188 hlineto + -3 -4 4 3 1 0 6 1 2 hvcurveto + 116 244 rlineto + 1 3 3 3 vhcurveto + endchar + + + 14 335 378 rmoveto + 81 34 72 44 97 vvcurveto + 109 -116 24 -113 vhcurveto + -247 hlineto + -7 -7 -1 -17 rlineto + 37 -10 46 -7 -34 vvcurveto + -530 vlineto + -56 -3 16 -20 -30 vhcurveto + 1 -10 rlineto + 1 131 -2 66 hhcurveto + 121 144 48 154 98 -48 52 -146 19 hvcurveto + -165 259 rmoveto + 21 6 44 -2 23 hhcurveto + 85 76 -19 -84 -118 -94 -46 -106 -20 -12 0 10 -2 hvcurveto + -53 vmoveto + 10 5 21 -2 36 hhcurveto + 100 106 -19 -119 -117 -91 -52 -102 -67 -8 4 23 hvcurveto + endchar + + + 88 624 586 rmoveto + 85 -52 -76 28 -88 hhcurveto + -104 -101 -36 -73 -73 hvcurveto + -70 -70 -21 -98 -96 vvcurveto + -98 26 -99 70 -70 vhcurveto + -57 57 82 -17 79 hhcurveto + 87 80 42 49 72 hvcurveto + -17 29 rlineto + -38 -56 -63 -29 -68 hhcurveto + -82 -42 28 55 -55 hvcurveto + -33 33 -48 98 92 vvcurveto + 152 64 162 182 82 63 -39 -90 34 vhcurveto + 14 -1 rlineto + endchar + + + 88 285 -112 rmoveto + 37 -11 50 -31 -28 -38 -14 -18 -32 -14 -26 -10 -5 -10 rcurveline + 6 -15 55 10 70 18 33 44 rlinecurve + 26 36 -9 36 -23 28 -19 23 -40 18 -13 5 11 26 rcurveline + 83 4 76 40 69 47 -17 29 rcurveline + -38 -56 -63 -29 -68 hhcurveto + -82 -42 28 55 -55 hvcurveto + -33 33 -48 98 92 vvcurveto + 152 64 162 182 82 63 -39 -90 34 vhcurveto + 14 -1 57 58 rlineto + 85 -52 -76 28 -88 hhcurveto + -104 -101 -36 -73 -73 hvcurveto + -70 -70 -21 -98 -96 vvcurveto + -98 26 -99 70 -70 vhcurveto + 51 -51 71 -19 71 -3 rrcurveto + endchar + + + 192 295 2 rmoveto + 104 131 16 73 67 hvcurveto + 77 83 22 84 127 vvcurveto + 177 -57 124 -310 vhcurveto + -313 hlineto + -7 -8 rlineto + -19 vlineto + 26 -8 47 -6 2 -25 rrcurveto + 1 -15 1 -16 -16 vvcurveto + -494 vlineto + -1 -38 -1 -14 -20 -15 rrcurveto + -10 vlineto + 106 573 rmoveto + 71 4 -10 10 5 vhcurveto + 3 6 17 1 43 hhcurveto + 131 100 -7 -47 48 hvcurveto + 56 -56 17 -97 -61 vvcurveto + -168 -65 -169 -270 -27 -39 0 13 -13 vhcurveto + -15 15 -2 62 -1 40 rrcurveto + endchar + + + 206 46 45 rmoveto + 2 -42 rlineto + 5 73 74 2 74 hhcurveto + 125 124 -6 -8 125 hvcurveto + 61 32 1 16 -108 209 -86 219 -74 224 rlinecurve + -58 -25 rlineto + 199 -621 rmoveto + -117 -118 3 -118 hhcurveto + -35 -35 0 -1 -35 hvcurveto + -3 12 80 169 80 157 95 164 rlinecurve + 11 hlineto + -1 160 -400 41 -94 vhcurveto + endchar + + + -27 417 384 rmoveto + -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + -148 -1 -7 -7 1 -20 47 -7 23 -12 6 -13 rlinecurve + 9 -20 0 -30 -14 vvcurveto + -492 vlineto + -27 6 -28 20 -11 vhcurveto + 388 hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + endchar + + + -27 385 885 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 194 -347 rmoveto + -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + -148 -1 -7 -7 1 -20 47 -7 23 -12 6 -13 rlinecurve + 9 -20 0 -30 -14 vvcurveto + -492 vlineto + -27 6 -28 20 -11 vhcurveto + 388 hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + endchar + + + -27 107 732 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + 141 -529 rmoveto + -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + -148 -1 -7 -7 1 -20 47 -7 23 -12 6 -13 rlinecurve + 9 -20 0 -30 -14 vvcurveto + -492 vlineto + -27 6 -28 20 -11 vhcurveto + 388 hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + endchar + + + -27 430 816 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 189 -432 rmoveto + -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + -148 -1 -7 -7 1 -20 47 -7 23 -12 6 -13 rlinecurve + 9 -20 0 -30 -14 vvcurveto + -492 vlineto + -27 6 -28 20 -11 vhcurveto + 388 hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + endchar + + + -27 140 886 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 230 -538 rmoveto + -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + -148 -1 -7 -7 1 -20 47 -7 23 -12 6 -13 rlinecurve + 9 -20 0 -30 -14 vvcurveto + -492 vlineto + -27 6 -28 20 -11 vhcurveto + 388 hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + endchar + + + 201 304 2 rmoveto + 104 131 16 73 67 hvcurveto + 77 83 22 84 127 vvcurveto + 177 -57 124 -310 vhcurveto + -313 hlineto + -7 -8 rlineto + -19 vlineto + 26 -8 47 -6 2 -25 rrcurveto + 1 -15 1 -16 -16 vvcurveto + -193 -69 vlineto + -7 -40 rlineto + 76 -261 hlineto + -1 -38 -1 -14 -20 -15 rrcurveto + -10 vlineto + 247 378 rmoveto + -141 195 hlineto + 71 4 -10 10 5 vhcurveto + 3 6 17 1 43 hhcurveto + 131 100 -7 -47 48 hvcurveto + 56 -56 17 -97 -61 vvcurveto + -168 -65 -169 -270 -27 -39 0 13 -13 vhcurveto + -15 15 -2 62 -1 40 rrcurveto + 170 135 vlineto + endchar + + + -104 87 360 rmoveto + -121 -3 -120 -4 -121 vhcurveto + 92 15 rlineto + -4 101 -1 115 101 vvcurveto + 7 7 4 5 71 88 -1 -4 70 vhcurveto + 5 5 1 49 rlineto + -3 -72 -90 -9 -73 hhcurveto + -9 -4 8 5 211 3 10 4 14 hvcurveto + 17 5 14 6 13 hhcurveto + 72 72 -15 -5 72 hvcurveto + 8 8 rlineto + 53 vlineto + -2 -73 -206 0 -142 hhcurveto + -7 -7 rlineto + -21 vlineto + 55 -13 rlineto + 40 -10 -7 -73 -43 vvcurveto + endchar + + + 116 325 270 rmoveto + 6 -5 54 -2 64 -3 44 -4 rlinecurve + 38 -4 -10 -98 -20 vvcurveto + -30 6 -54 -26 -5 vhcurveto + -7 -31 -31 -3 -32 hhcurveto + -196 -82 159 146 152 55 158 187 81 59 -32 -88 44 hvcurveto + 12 -1 58 57 rlineto + 81 -53 -69 32 -87 hhcurveto + -105 -105 -31 -75 -75 hvcurveto + -70 -70 -22 -101 -98 vvcurveto + -95 25 -98 68 -68 vhcurveto + -54 54 75 -26 76 hhcurveto + 73 108 27 23 88 hvcurveto + 1 -3 182 -2 91 vhcurveto + -276 -11 rlineto + endchar + + + -53 464 697 rmoveto + -3 -60 -61 -1 -61 hhcurveto + -237 hlineto + -3 -20 26 -22 rlineto + 21 -18 -5 -50 -30 vvcurveto + -92 -4 -274 -3 -183 vhcurveto + 10 -11 77 23 rlineto + -3 178 0 178 177 vvcurveto + 37 -2 61 38 3 vhcurveto + 1 20 21 1 20 hhcurveto + 59 95 1 -49 15 hvcurveto + 25 -82 rlineto + 25 hlineto + endchar + + + 161 699 32 rmoveto + -7 -70 11 36 hvcurveto + -3 81 -1 81 81 vvcurveto + 121 2 120 9 121 vhcurveto + -5 6 -88 -17 rlineto + -86 3 -104 -86 vvcurveto + -6 -1 -6 -11 vhcurveto + -346 hlineto + -10 -2 7 5 92 1 123 12 68 hvcurveto + -5 5 rlineto + -162 hlineto + -7 -7 1 -19 57 -20 14 4 2 -27 rlinecurve + 6 -83 0 -83 -83 vvcurveto + -122 0 -129 -10 -113 vhcurveto + 6 -5 92 28 rlineto + -6 50 0 44 58 54 1 57 45 vvcurveto + 7 6 5 7 vhcurveto + 343 hlineto + 9 3 -7 -5 -97 -3 -119 -2 -97 hvcurveto + 11 -21 rlineto + 149 hlineto + 6 14 rlineto + endchar + + + -265 275 23 rmoveto + -1 -43 11 6 -21 hvcurveto + -42 11 11 75 -1 43 rrcurveto + -1 61 -1 62 67 vvcurveto + 78 -6 119 9 59 vhcurveto + 1 12 8 11 13 3 67 15 rcurveline + 21 vlineto + -6 6 rlineto + -250 hlineto + -7 -6 rlineto + -22 vlineto + 80 -18 7 5 2 -30 rrcurveto + 3 -38 0 -38 -39 vvcurveto + -363 vlineto + -4 -83 13 -7 -98 -19 rrcurveto + -26 265 vlineto + endchar + + + -265 252 885 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 185 -708 rmoveto + -1 -43 11 6 -21 hvcurveto + -42 11 11 75 -1 43 rrcurveto + -1 61 -1 62 67 vvcurveto + 78 -6 119 9 59 vhcurveto + 1 12 8 11 13 3 67 15 rcurveline + 21 vlineto + -6 6 rlineto + -250 hlineto + -7 -6 rlineto + -22 vlineto + 80 -18 7 5 2 -30 rrcurveto + 3 -38 0 -38 -39 vvcurveto + -363 vlineto + -4 -83 13 -7 -98 -19 rrcurveto + -26 265 vlineto + endchar + + + -265 -26 732 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + 132 -890 rmoveto + -1 -43 11 6 -21 hvcurveto + -42 11 11 75 -1 43 rrcurveto + -1 61 -1 62 67 vvcurveto + 78 -6 119 9 59 vhcurveto + 1 12 8 11 13 3 67 15 rcurveline + 21 vlineto + -6 6 rlineto + -250 hlineto + -7 -6 rlineto + -22 vlineto + 80 -18 7 5 2 -30 rrcurveto + 3 -38 0 -38 -39 vvcurveto + -363 vlineto + -4 -83 13 -7 -98 -19 rrcurveto + -26 265 vlineto + endchar + + + -265 297 816 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 180 -793 rmoveto + -1 -43 11 6 -21 hvcurveto + -42 11 11 75 -1 43 rrcurveto + -1 61 -1 62 67 vvcurveto + 78 -6 119 9 59 vhcurveto + 1 12 8 11 13 3 67 15 rcurveline + 21 vlineto + -6 6 rlineto + -250 hlineto + -7 -6 rlineto + -22 vlineto + 80 -18 7 5 2 -30 rrcurveto + 3 -38 0 -38 -39 vvcurveto + -363 vlineto + -4 -83 13 -7 -98 -19 rrcurveto + -26 265 vlineto + endchar + + + -265 7 886 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 221 -899 rmoveto + -1 -43 11 6 -21 hvcurveto + -42 11 11 75 -1 43 rrcurveto + -1 61 -1 62 67 vvcurveto + 78 -6 119 9 59 vhcurveto + 1 12 8 11 13 3 67 15 rcurveline + 21 vlineto + -6 6 rlineto + -250 hlineto + -7 -6 rlineto + -22 vlineto + 80 -18 7 5 2 -30 rrcurveto + 3 -38 0 -38 -39 vvcurveto + -363 vlineto + -4 -83 13 -7 -98 -19 rrcurveto + -26 265 vlineto + endchar + + + -280 175 608 rmoveto + 18 9 17 12 3 vhcurveto + 68 14 2 24 -7 6 rlineto + -250 hlineto + -7 -6 rlineto + -21 vlineto + 72 -18 rlineto + 12 -3 4 -23 -11 vvcurveto + -512 vlineto + -202 -47 -61 -78 -49 vhcurveto + 14 -18 rlineto + 134 69 62 101 155 vvcurveto + endchar + + + 48 178 319 rmoveto + 108 -109 112 -105 105 -112 85 31 rcurveline + 1 11 -61 54 -165 164 -107 107 rlinecurve + -4 4 -1 2 3 vvcurveto + 3 5 5 3 3 vhcurveto + 291 294 1 9 rlineto + -90 hlineto + -287 -326 -8 1 rlineto + 202 4 83 11 33 vhcurveto + -7 7 rlineto + -158 hlineto + -8 -7 -2 -17 rlineto + 6 60 -16 -17 9 hvcurveto + 4 -10 1 -11 -10 vvcurveto + -594 vlineto + 8 -5 81 29 rlineto + -6 97 0 98 98 vvcurveto + endchar + + + -51 482 58 rmoveto + -1 -6 -182 -14 -104 hhcurveto + -5 -7 7 6 -1 hvcurveto + -4 108 -3 116 113 vvcurveto + 80 2 78 4 73 vhcurveto + 1 11 5 12 12 2 rrcurveto + 5 21 43 9 1 hhcurveto + 21 vlineto + -6 6 rlineto + -237 hlineto + -7 -7 -1 -17 rlineto + 1 37 -8 -4 20 hvcurveto + 15 -3 6 -16 -14 vvcurveto + -478 vlineto + -52 -6 -53 -16 -22 vhcurveto + -14 vlineto + 138 201 0 -7 74 hvcurveto + 14 53 rlineto + endchar + + + 203 368 673 rmoveto + -115 -227 -123 -222 -127 -220 13 -10 rcurveline + 27 4 26 9 25 10 28 66 146 294 95 188 rrcurveto + 12 hlineto + 63 -188 59 -190 68 -186 23 -8 rcurveline + 53 10 52 14 52 16 1 22 rcurveline + -67 -3 -13 -1 -14 8 -5 12 rlinecurve + -96 200 -63 212 -54 215 rrcurveto + endchar + + + 417 475 147 rmoveto + -4 -2 -6 -5 -4 hhcurveto + -4 -5 10 4 -2 hvcurveto + -83 177 -94 200 -55 161 rrcurveto + -176 hlineto + -7 -7 -2 -22 68 -19 rlineto + 18 -5 10 -16 -18 vvcurveto + -4 0 -4 -1 -4 vhcurveto + -27 -198 -35 -197 -38 -196 7 -3 rcurveline + 75 26 rlineto + 90 7 34 435 21 hhcurveto + 4 4 -5 -5 3 hvcurveto + 63 -128 94 -229 75 -180 rrcurveto + 30 hlineto + 286 554 rlineto + 5 3 5 3 3 hhcurveto + 5 3 -7 -8 hvcurveto + 2 -66 8 -246 -25 vvcurveto + -182 vlineto + -26 33 -9 30 40 52 18 16 44 vhcurveto + 24 vlineto + -2 -18 -25 -4 -13 hhcurveto + -33 -22 27 29 -3 hvcurveto + -17 164 -1 153 164 vvcurveto + 44 -2 37 27 14 vhcurveto + 12 -103 vlineto + endchar + + + 187 577 678 rmoveto + 21 -304 3 -99 -102 vvcurveto + -2 -1 -6 -5 -4 -4 5 3 -3 vhcurveto + -117 126 -162 215 -133 176 rrcurveto + -162 hlineto + -8 -7 4 -27 rlineto + 95 -23 -10 -4 -21 -43 1 -43 -43 vvcurveto + -158 -5 -159 -8 -158 vhcurveto + 9 -9 70 30 rlineto + -11 174 -13 219 129 vvcurveto + 5 0 12 7 4 4 -5 -4 3 vhcurveto + 49 -56 83 -95 102 -126 159 -198 rcurveline + 30 -38 14 -16 23 -26 rrcurveto + 36 hlineto + 227 2 232 13 227 vhcurveto + -6 8 rlineto + endchar + + + 187 393 841 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + 137 -142 rmoveto + 21 -304 3 -99 -102 vvcurveto + -2 -1 -6 -5 -4 -4 5 3 -3 vhcurveto + -117 126 -162 215 -133 176 rrcurveto + -162 hlineto + -8 -7 4 -27 rlineto + 95 -23 -10 -4 -21 -43 1 -43 -43 vvcurveto + -158 -5 -159 -8 -158 vhcurveto + 9 -9 70 30 rlineto + -11 174 -13 219 129 vvcurveto + 5 0 12 7 4 4 -5 -4 3 vhcurveto + 49 -56 83 -95 102 -126 159 -198 rcurveline + 30 -38 14 -16 23 -26 rrcurveto + 36 hlineto + 227 2 232 13 227 vhcurveto + -6 8 rlineto + endchar + + + 192 320 -18 rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + 54 -54 -79 22 -75 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -165 74 -171 205 vhcurveto + 51 678 rmoveto + 169 61 -182 -142 -150 -62 -163 -166 -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + endchar + + + 452 896 384 rmoveto + -6 7 rlineto + -4 -53 -74 -3 -53 hhcurveto + -37 -29 -3 17 hvcurveto + 166 vlineto + 35 4 37 20 4 vhcurveto + 40 hlineto + 7 133 -6 -4 69 hvcurveto + 4 7 2 50 rlineto + 1 -13 -15 0 -18 hhcurveto + -1 -71 -101 -5 -70 hhcurveto + -117 -1 rlineto + 13 -37 -39 6 -39 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -165 74 -171 205 47 45 6 12 40 vhcurveto + 528 hlineto + 13 53 -5 5 rlineto + -14 -164 -23 0 -47 hhcurveto + -61 -21 6 26 -14 hvcurveto + -14 25 -1 49 38 vvcurveto + 139 vlineto + 18 71 -3 58 39 40 -3 -3 39 vhcurveto + -756 12 rmoveto + 152 64 160 173 99 62 -62 -80 34 vhcurveto + -363 vlineto + -76 -34 -62 -56 -97 hhcurveto + -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + endchar + + + 209 557 918 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + -75 -782 rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + 54 -54 -79 22 -75 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -165 74 -171 205 vhcurveto + 51 678 rmoveto + 169 61 -182 -142 -150 -62 -163 -166 -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + endchar + + + 192 218 742 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + -67 -941 rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + 54 -54 -79 22 -75 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -165 74 -171 205 vhcurveto + 51 678 rmoveto + 169 61 -182 -142 -150 -62 -163 -166 -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + endchar + + + 192 541 826 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -19 -844 rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + 54 -54 -79 22 -75 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -165 74 -171 205 vhcurveto + 51 678 rmoveto + 169 61 -182 -142 -150 -62 -163 -166 -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + endchar + + + 192 251 896 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 22 -950 rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + 54 -54 -79 22 -75 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -165 74 -171 205 vhcurveto + 51 678 rmoveto + 169 61 -182 -142 -150 -62 -163 -166 -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + endchar + + + 360 853 60 rmoveto + -70 -96 -5 -4 -85 hvcurveto + 12 vlineto + 135 55 50 138 129 vvcurveto + 153 -69 151 -237 -99 -99 -23 -71 -71 vhcurveto + -68 -68 -28 -93 -96 vvcurveto + -113 30 -97 110 -59 vhcurveto + -6 -15 -53 5 -76 3 -61 3 rlinecurve + -17 -61 rlineto + 3 40 40 1 41 hhcurveto + 69 69 -4 -6 70 hvcurveto + 21 55 rlineto + -144 28 -45 130 118 vvcurveto + 160 68 165 190 167 68 -149 -137 -138 -43 -137 -154 -36 vhcurveto + -9 -58 rlineto + 4 56 56 2 56 hhcurveto + 59 60 -2 -5 59 hvcurveto + 25 53 rlineto + endchar + + + 192 320 -18 rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + -21 21 -25 16 -26 12 43 100 rcurveline + -5 11 -22 5 -11 -2 -44 -100 rlineto + 9 -31 -33 4 -33 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -129 45 -133 118 -51 vhcurveto + -46 -106 3 -14 32 -8 50 114 rlineto + -6 23 26 -3 28 hhcurveto + 51 678 rmoveto + 41 35 -11 -18 29 hvcurveto + -240 -554 -8 7 -7 8 -8 8 rlinecurve + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + 230 -324 rmoveto + -150 -62 -163 -166 -27 -37 5 24 -40 vhcurveto + 240 553 rlineto + 66 -65 26 -111 -93 vvcurveto + endchar + + + 192 379 851 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + -106 -848 rmoveto + 157 129 72 98 48 hvcurveto + 40 81 1 65 66 vvcurveto + 93 -22 104 -62 63 vhcurveto + 54 -54 -79 22 -75 hhcurveto + -93 -105 -20 -68 -63 hvcurveto + -74 -80 -27 -85 -129 vvcurveto + -165 74 -171 205 vhcurveto + 51 678 rmoveto + 169 61 -182 -142 -150 -62 -163 -166 -39 -61 10 67 -60 hvcurveto + -62 68 -17 86 94 vvcurveto + 152 64 160 173 vhcurveto + endchar + + + -18 172 22 rmoveto + -1 101 -6 126 25 vvcurveto + 19 65 -2 29 2 vhcurveto + 65 5 73 15 44 45 rrcurveto + 42 42 22 55 59 vvcurveto + 106 -67 59 -164 vhcurveto + -257 hlineto + -7 -7 rlineto + -18 vlineto + 38 -5 33 -9 3 -40 rrcurveto + 3 -59 2 -59 -59 vvcurveto + -141 -5 -141 -2 -140 vhcurveto + 7 -7 rlineto + 147 646 rmoveto + 92 81 -30 -104 -111 -94 -66 -139 -4 -7 3 9 87 2 113 4 88 hvcurveto + 5 2 6 7 vhcurveto + endchar + + + 187 234 657 rmoveto + 63 -9 rlineto + 13 -2 10 -12 -14 vvcurveto + -12 vlineto + -8 -7 -82 -2 -81 -29 -57 -58 rlinecurve + -47 -48 -17 -67 -65 vvcurveto + -173 141 -71 144 -2 vhcurveto + 7 -6 -2 -16 -6 -22 -16 -4 rlinecurve + -62 -15 rlineto + -21 268 24 vlineto + -59 12 -21 4 -13 18 -3 20 rlinecurve + 8 6 72 3 92 27 52 52 rlinecurve + 53 53 20 77 75 vvcurveto + 130 -77 98 -213 vhcurveto + -7 7 rlineto + 13 vlineto + 14 9 14 15 2 vhcurveto + 63 10 rlineto + 25 vlineto + -259 -2 rlineto + 179 -111 rmoveto + 109 -2 89 -48 -171 vvcurveto + -119 -60 -116 -139 -3 vhcurveto + -6 8 rlineto + 443 vlineto + -93 -451 rmoveto + -126 3 -67 121 109 vvcurveto + 116 71 105 122 5 vhcurveto + 7 -8 rlineto + -444 vlineto + endchar + + + 123 668 686 rmoveto + -2 -81 -119 -3 -44 hhcurveto + -198 hlineto + -75 -75 4 5 -75 hvcurveto + -30 vlineto + 57 -17 9 -3 9 -8 rrcurveto + 12 -12 1 -56 -30 vvcurveto + -73 vlineto + -154 -1 -152 -7 -153 vhcurveto + 7 -6 85 19 rlineto + -2 103 -3 122 82 vvcurveto + 102 0 101 7 101 vhcurveto + 8 8 6 6 vhcurveto + 289 hlineto + 2 11 -3 -10 hvcurveto + 1 -108 1 -121 -108 vvcurveto + -98 0 -97 -3 -98 vhcurveto + 14 -11 80 22 rlineto + -10 135 -2 134 135 vvcurveto + 101 2 115 5 7 vhcurveto + 4 3 4 2 5 1 76 17 rcurveline + endchar + + + 191 443 251 rmoveto + 117 2 74 32 31 203 16 90 1 55 44 28 -3 18 rcurveline + -35 -4 -35 -8 -34 -12 -12 -43 -1 -45 -6 -44 -18 -127 -29 -114 -112 -6 -7 6 rcurveline + -2 58 -1 59 59 vvcurveto + 75 6 74 7 75 vhcurveto + -4 8 -86 -23 rlineto + 6 -82 0 -120 -100 vvcurveto + -83 vlineto + -6 -7 rlineto + -150 8 -18 180 132 vvcurveto + 58 -7 41 -36 -12 -20 0 -2 -3 vhcurveto + -108 -36 7 -22 63 10 rlineto + 2 hlineto + 67 -47 -105 -167 49 hvcurveto + -90 23 71 -34 119 hhcurveto + 6 -6 rlineto + -155 vlineto + -9 -7 -36 -22 -4 vhcurveto + -68 -12 rlineto + -27 266 27 vlineto + -57 12 rlineto + -22 5 -11 21 22 vvcurveto + -2 158 rlineto + endchar + + + 195 722 -174 rmoveto + -6 -23 -48 -9 -16 hhcurveto + -89 -42 46 21 -15 hvcurveto + -20 26 -26 49 -16 30 4 10 rcurveline + 63 15 70 30 45 49 42 46 11 33 15 44 rrcurveto + 13 41 6 18 97 vvcurveto + 83 -20 110 -63 63 vhcurveto + 58 -58 -78 18 -77 hhcurveto + -95 -95 -19 -70 -68 hvcurveto + -74 -76 -27 -95 -138 vvcurveto + -90 29 -90 56 -63 vhcurveto + -55 49 77 -18 69 hhcurveto + -101 62 75 -118 116 hhcurveto + 51 65 25 16 39 hvcurveto + -364 216 rmoveto + -53 -55 30 40 -38 hvcurveto + -62 64 -23 89 89 vvcurveto + 147 50 179 192 151 74 -165 -157 -140 -50 -176 -186 vhcurveto + endchar + + + 3 275 331 rmoveto + 119 13 96 56 139 vvcurveto + 93 -81 47 -122 vhcurveto + -272 hlineto + -6 -6 -1 -17 rlineto + 9 68 -13 -32 hvcurveto + -57 3 -100 -15 vvcurveto + -145 -1 -146 -8 -145 vhcurveto + 11 -9 83 29 rlineto + -5 96 0 97 96 vvcurveto + 6 9 -4 -5 5 hvcurveto + 29 -29 127 -163 93 -119 99 26 rcurveline + 9 vlineto + -263 296 rlineto + -106 47 rmoveto + 5 4 175 2 64 vhcurveto + 19 1 3 7 8 hhcurveto + 40 hlineto + 78 89 -21 -96 -119 -106 -49 -110 -7 -2 9 6 hvcurveto + endchar + + + -61 451 606 rmoveto + 83 -44 -60 13 -73 hhcurveto + -109 -103 -65 -125 -98 62 -48 121 -52 hvcurveto + 60 -26 61 -54 -56 vvcurveto + -84 -65 -63 -78 -71 -41 51 70 -21 vhcurveto + -17 1 -57 -66 rlineto + -73 28 68 -29 69 hhcurveto + 127 146 92 132 80 -54 54 -105 46 hvcurveto + -78 34 -75 46 78 vvcurveto + 65 47 53 64 68 37 -46 -66 17 vhcurveto + 13 -3 rlineto + endchar + + + 26 299 362 rmoveto + 4 7 7 9 6 vvcurveto + 6 -2 5 -3 5 vhcurveto + -137 222 11 13 rlineto + 331 hlineto + 22 49 -4 11 rlineto + -5 -102 -102 -3 -102 hhcurveto + -36 -36 0 1 -36 hvcurveto + -68 -47 152 -225 14 -20 14 -24 8 -22 rlinecurve + -10 -25 -25 -34 -19 -26 -163 -216 rcurveline + -4 -19 -5 -27 -1 vvcurveto + 90 90 7 90 hhcurveto + 89 88 -1 -3 89 hvcurveto + 15 89 -3 10 rlineto + -8 -53 -54 -2 -54 hhcurveto + -89 -88 0 2 -89 hvcurveto + -5 10 rlineto + endchar + + + 6 543 696 rmoveto + -4 -88 -99 -6 -75 hhcurveto + -177 0 8 3 -95 hvcurveto + -7 -7 rlineto + -48 vlineto + 8 -7 rlineto + 4 111 79 3 24 hhcurveto + 5 4 -2 -4 hvcurveto + 1 -30 1 -144 -82 vvcurveto + -127 -5 -127 -8 -127 vhcurveto + 9 -9 100 27 rlineto + -7 121 -6 179 121 vvcurveto + 121 -1 85 14 21 21 -2 -8 168 vhcurveto + 8 7 rlineto + 48 vlineto + endchar + + + 233 348 -12 rmoveto + 196 194 83 310 87 -20 93 -63 63 hvcurveto + 57 -57 -84 20 -79 hhcurveto + -152 -139 -58 -100 -58 hvcurveto + -43 -74 -2 -42 -96 vvcurveto + -99 26 -102 71 -71 vhcurveto + -55 54 80 -16 76 hhcurveto + 43 43 rmoveto + -183 -74 166 148 159 53 159 194 68 69 -18 -49 49 hvcurveto + 57 -57 20 -82 -80 vvcurveto + -91 -6 -119 -59 -59 vhcurveto + -50 -50 -53 -27 -85 hhcurveto + -171 210 rmoveto + 27 65 hlineto + 14 15 2 10 vhcurveto + 2 46 51 2 40 35 34 -4 35 hhcurveto + 22 -3 -42 -22 hvcurveto + -5 -1 -4 -5 vvcurveto + 30 -1 rlineto + 214 -28 vlineto + 2 -51 rlineto + -31 1 -83 9 -40 hhcurveto + -53 -114 -5 21 hvcurveto + 19 -4 19 19 vvcurveto + -25 hlineto + 3 -108 rlineto + endchar + + + -18 168 679 rmoveto + -151 hlineto + -7 -7 rlineto + -18 vlineto + 38 -5 33 -9 3 -40 rrcurveto + 3 -59 2 -59 -59 vvcurveto + -141 -5 -141 -2 -140 vhcurveto + 7 -7 83 28 rlineto + -1 101 -6 22 24 vvcurveto + 19 65 -2 29 2 vhcurveto + 65 5 73 15 44 45 rrcurveto + 42 42 22 55 59 vvcurveto + 106 -67 59 -164 vhcurveto + -105 hlineto + 1 27 1 53 4 19 rrcurveto + 61 -138 rmoveto + 92 81 -30 -104 -111 -96 -66 -139 -4 -7 3 9 87 2 113 4 88 hvcurveto + 5 2 6 7 vhcurveto + endchar + + + 167 183 674 rmoveto + -7 6 rlineto + -169 hlineto + -8 -7 2 -20 rlineto + 14 74 -12 -40 hvcurveto + -59 vlineto + -78 -2 -79 -77 vvcurveto + -61 1 -74 7 -46 vhcurveto + -59 12 33 -77 139 hhcurveto + 83 80 34 45 70 hvcurveto + 8 -6 rlineto + -30 -6 -39 39 31 71 21 16 51 vhcurveto + 5 7 -4 17 rlineto + -2 -20 -18 -6 -20 hhcurveto + -48 0 72 82 162 1 209 15 114 hvcurveto + -6 7 -88 -35 rlineto + -2 -182 -2 -183 -183 vvcurveto + -32 -54 -60 -27 -62 hhcurveto + -97 -79 49 168 hvcurveto + 8 273 rlineto + 17 5 101 3 14 vhcurveto + endchar + + + 167 482 885 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + -137 -57 rmoveto + -7 6 rlineto + -169 hlineto + -8 -7 2 -20 rlineto + 14 74 -12 -40 hvcurveto + -59 vlineto + -78 -2 -79 -77 vvcurveto + -61 1 -74 7 -46 vhcurveto + -59 12 33 -77 139 hhcurveto + 83 80 34 45 70 hvcurveto + 8 -6 rlineto + -30 -6 -39 39 31 71 21 16 51 vhcurveto + 5 7 -4 17 rlineto + -2 -20 -18 -6 -20 hhcurveto + -48 0 72 82 162 1 209 15 114 hvcurveto + -6 7 -88 -35 rlineto + -2 -182 -2 -183 -183 vvcurveto + -32 -54 -60 -27 -62 hhcurveto + -97 -79 49 168 hvcurveto + 8 273 rlineto + 17 5 101 3 14 vhcurveto + endchar + + + 167 204 732 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + -190 -239 rmoveto + -7 6 rlineto + -169 hlineto + -8 -7 2 -20 rlineto + 14 74 -12 -40 hvcurveto + -59 vlineto + -78 -2 -79 -77 vvcurveto + -61 1 -74 7 -46 vhcurveto + -59 12 33 -77 139 hhcurveto + 83 80 34 45 70 hvcurveto + 8 -6 rlineto + -30 -6 -39 39 31 71 21 16 51 vhcurveto + 5 7 -4 17 rlineto + -2 -20 -18 -6 -20 hhcurveto + -48 0 72 82 162 1 209 15 114 hvcurveto + -6 7 -88 -35 rlineto + -2 -182 -2 -183 -183 vvcurveto + -32 -54 -60 -27 -62 hhcurveto + -97 -79 49 168 hvcurveto + 8 273 rlineto + 17 5 101 3 14 vhcurveto + endchar + + + 167 527 816 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -142 -142 rmoveto + -7 6 rlineto + -169 hlineto + -8 -7 2 -20 rlineto + 14 74 -12 -40 hvcurveto + -59 vlineto + -78 -2 -79 -77 vvcurveto + -61 1 -74 7 -46 vhcurveto + -59 12 33 -77 139 hhcurveto + 83 80 34 45 70 hvcurveto + 8 -6 rlineto + -30 -6 -39 39 31 71 21 16 51 vhcurveto + 5 7 -4 17 rlineto + -2 -20 -18 -6 -20 hhcurveto + -48 0 72 82 162 1 209 15 114 hvcurveto + -6 7 -88 -35 rlineto + -2 -182 -2 -183 -183 vvcurveto + -32 -54 -60 -27 -62 hhcurveto + -97 -79 49 168 hvcurveto + 8 273 rlineto + 17 5 101 3 14 vhcurveto + endchar + + + 167 237 886 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + -101 -248 rmoveto + -7 6 rlineto + -169 hlineto + -8 -7 2 -20 rlineto + 14 74 -12 -40 hvcurveto + -59 vlineto + -78 -2 -79 -77 vvcurveto + -61 1 -74 7 -46 vhcurveto + -59 12 33 -77 139 hhcurveto + 83 80 34 45 70 hvcurveto + 8 -6 rlineto + -30 -6 -39 39 31 71 21 16 51 vhcurveto + 5 7 -4 17 rlineto + -2 -20 -18 -6 -20 hhcurveto + -48 0 72 82 162 1 209 15 114 hvcurveto + -6 7 -88 -35 rlineto + -2 -182 -2 -183 -183 vvcurveto + -32 -54 -60 -27 -62 hhcurveto + -97 -79 49 168 hvcurveto + 8 273 rlineto + 17 5 101 3 14 vhcurveto + endchar + + + 137 672 546 rmoveto + 75 -21 76 -85 -155 -48 -199 -123 -21 vhcurveto + -9 hlineto + 130 -13 -32 192 -146 hhcurveto + -94 -29 -73 -69 -12 hvcurveto + 19 -7 rlineto + 40 12 27 37 47 hhcurveto + 84 48 -102 -77 21 hvcurveto + 20 -73 7 -76 -76 vvcurveto + -75 0 -75 -4 -75 vhcurveto + 17 -7 67 36 rlineto + 322 2 113 127 127 vhcurveto + 20 20 25 11 28 hhcurveto + 52 18 -38 -37 6 hvcurveto + endchar + + + 162 614 680 rmoveto + -25 -43 -25 -44 -19 -45 -119 -274 rcurveline + -41 -89 -23 -52 -7 -2 -2 1 -4 2 -2 4 -71 182 -55 187 -39 191 -175 -10 rcurveline + -7 -6 1 -27 56 -8 23 -5 16 -33 rlinecurve + 20 -44 13 -46 15 -46 143 -482 rcurveline + 10 -7 68 26 57 165 73 160 72 133 rlinecurve + 12 21 62 110 65 79 -6 19 rcurveline + endchar + + + 505 965 675 rmoveto + -17 -32 -22 -39 -21 -46 -109 -242 rcurveline + -80 -170 rlineto + -3 -2 -2 -4 -9 hhcurveto + -18 -19 131 55 -12 hvcurveto + -31 146 -31 151 62 vvcurveto + -7 6 -76 -29 -45 -126 -132 -291 -42 -83 rlinecurve + -2 -1 -3 -2 -3 hhcurveto + -2 -4 1 5 -1 hvcurveto + -39 175 -59 270 -15 81 -156 -3 rcurveline + -8 -7 2 -24 31 -6 30 -7 11 -28 rlinecurve + 30 -77 20 -81 20 -81 30 -126 25 -127 23 -128 11 -5 rcurveline + 64 29 47 155 81 179 54 121 rlinecurve + 28 63 rlineto + 5 2 4 7 3 hhcurveto + 5 1 -7 -5 1 hvcurveto + 40 -179 37 -179 32 -181 12 -8 rcurveline + 60 27 65 157 116 230 47 77 rlinecurve + 115 188 rlineto + 21 vlineto + endchar + + + 79 612 687 rmoveto + -95 -13 -9 -21 -138 -198 -33 -33 rlinecurve + -9 hlineto + -147 266 -45 -3 -76 -4 -25 -1 rlinecurve + -7 -6 rlineto + -25 vlineto + 41 -11 42 -10 22 -38 rrcurveto + -82 47 93 -163 5 hhcurveto + -271 -329 rlineto + -16 vlineto + 94 11 36 76 111 157 43 52 rlinecurve + 12 hlineto + 143 -239 13 -22 15 -22 18 -18 rlinecurve + 14 -6 110 27 rlineto + 16 vlineto + -5 4 -8 2 -22 14 -7 7 rlinecurve + -60 72 -40 48 -115 189 -1 12 rlinecurve + 4 7 33 44 30 35 187 206 rcurveline + endchar + + + 68 49 695 rmoveto + -5 -57 -1 -58 -7 -57 27 2 rcurveline + 23 64 rlineto + 20 7 24 9 20 hhcurveto + 346 hlineto + 18 23 -12 -21 4 hvcurveto + 16 -61 rlineto + 34 hlineto + -22 164 rlineto + -425 -359 rmoveto + 2 47 47 1 47 hhcurveto + 55 54 -1 -1 54 hvcurveto + 15 72 rlineto + -3 -64 -63 -2 -64 hhcurveto + -37 -37 0 2 -37 hvcurveto + 405 -252 rmoveto + -63 -18 1 -12 -22 hhcurveto + -401 hlineto + -17 -15 11 19 -5 hvcurveto + -14 51 -26 -1 rlineto + 4 -51 7 -100 -1 vvcurveto + -2 172 343 -4 1 hhcurveto + 15 153 rlineto + endchar + + + 47 231 -2 rmoveto + 11 -9 90 29 -9 288 83 128 74 96 111 145 rlinecurve + -4 18 -85 -17 -36 -57 -84 -145 -8 -14 rlinecurve + -54 -30 -35 -53 -5 hhcurveto + -6 -5 6 2 -1 hvcurveto + -141 325 rlineto + -145 hlineto + -7 -7 rlineto + -28 vlineto + 40 -6 23 -6 23 -45 149 -295 rcurveline + -100 0 -101 -3 -100 vhcurveto + endchar + + + 47 451 885 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + -58 -733 rmoveto + 11 -9 90 29 -9 288 83 128 74 96 111 145 rlinecurve + -4 18 -85 -17 -36 -57 -84 -145 -8 -14 rlinecurve + -54 -30 -35 -53 -5 hhcurveto + -6 -5 6 2 -1 hvcurveto + -141 325 rlineto + -145 hlineto + -7 -7 rlineto + -28 vlineto + 40 -6 23 -6 23 -45 149 -295 rcurveline + -100 0 -101 -3 -100 vhcurveto + endchar + + + 58 552 683 rmoveto + -149 -148 3 9 -148 hvcurveto + -9 -8 rlineto + -54 vlineto + 6 -5 rlineto + 3 27 102 6 187 hhcurveto + 7 -10 -424 -606 1 -21 rlineto + 192 254 0 -12 129 hvcurveto + 18 71 -9 9 rlineto + -429 hlineto + -6 -7 90 139 174 271 135 193 rlinecurve + endchar + + + 3 278 466 rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + 3 389 702 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 51 -82 rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + 3 111 549 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + -2 -264 rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + -25 405 664 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + endchar + + + -545 115 664 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + endchar + + + 3 434 633 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 46 -167 rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + 207 707 319 rmoveto + 11 5 10 4 12 vvcurveto + 77 -56 61 -86 -67 -64 -25 -46 -48 vhcurveto + 39 -22 -65 20 -42 hhcurveto + -170 -68 -140 -141 -90 36 -107 111 67 65 41 37 51 hvcurveto + -46 25 41 -32 68 hhcurveto + 86 80 58 58 62 hvcurveto + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + 42 199 rmoveto + 26 21 30 16 33 hhcurveto + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + -104 -48 rmoveto + -18 -37 -7 -43 -42 vvcurveto + -45 5 -46 14 -40 vhcurveto + -21 -29 -34 -20 -37 hhcurveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 12 -13 3 -18 1 -19 rrcurveto + endchar + + + -117 217 167 rmoveto + 50 226 -122 160 -114 -333 -40 -116 -21 -132 120 31 84 22 27 68 16 74 rrcurveto + -79 98 rmoveto + 13 -9 37 -78 -17 -11 -29 -18 -46 -17 -39 17 -6 3 -9 8 2 4 4 15 42 119 48 -33 rrcurveto + endchar + + + 3 144 703 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 87 -273 rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + 319 206 262 rmoveto + -117 -92 -114 -220 30 -142 55 -261 425 67 163 198 4 4 -12 -3 -5 -1 -175 -46 -260 -38 -136 153 -78 88 247 210 55 48 40 35 65 42 14 36 45 116 rcurveline + -60 -58 -97 -59 -47 46 -32 27 -16 25 -8 49 40 -4 34 -7 31 -10 42 130 rcurveline + -33 8 -29 8 -35 1 -99 2 -58 -206 91 -113 9 -12 10 -11 11 -10 rrcurveto + endchar + + + -23 389 548 rmoveto + -10 hlineto + -24 -18 -2 -4 -15 hvcurveto + -6 -5 -17 -18 -27 -33 rrcurveto + -25 -30 -13 -20 -11 -1 1 -1 -1 vvcurveto + 14 -90 -116 -114 -49 -53 -36 -66 -24 -78 rlinecurve + -16 -51 -8 -49 -44 vvcurveto + -102 38 -67 68 -34 vhcurveto + -22 45 51 -11 55 hhcurveto + 85 67 19 35 76 hvcurveto + 67 31 53 40 41 49 rrcurveto + 2 vlineto + 1 0 0 -1 -2 -5 -1 -2 -6 vhcurveto + -19 -77 -100 -21 -96 hhcurveto + -132 -99 35 74 -66 hvcurveto + -12 14 -6 16 19 vvcurveto + 11 2 11 5 13 vhcurveto + 11 34 18 34 24 35 37 52 64 69 41 37 19 16 22 17 27 19 27 19 18 17 10 17 5 6 5 8 7 10 51 79 rcurveline + 8 12 6 15 7 19 rrcurveto + 2 6 1 6 6 vvcurveto + 35 -31 11 -41 1 vhcurveto + endchar + + + 156 274 317 rmoveto + 36 -3 35 -8 34 -10 42 130 rcurveline + -32 8 -27 8 -37 1 rrcurveto + -1 hlineto + -21 -20 -10 -21 -17 hvcurveto + -33 -40 -26 -67 -70 vvcurveto + -29 6 -24 12 -18 vhcurveto + -62 -17 -60 -6 -80 -11 -23 -130 rcurveline + 70 15 73 16 78 18 78 18 74 28 71 38 1 2 3 7 7 14 12 24 15 34 8 25 rrcurveto + 2 5 1 4 3 vvcurveto + 2 0 1 -2 vhcurveto + -2 hlineto + -24 -9 -23 -11 -22 -11 -22 -11 -26 -6 -31 -1 -31 27 -28 35 -8 50 rrcurveto + endchar + + + 352 461 323 rmoveto + 35 -3 35 -7 35 -11 42 130 rcurveline + -32 8 -28 8 -37 1 -52 1 -33 -66 -15 -44 -17 -52 -10 -75 28 -43 -47 -14 -90 -18 -63 -6 -70 -7 -89 0 -14 51 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 rrcurveto + 38 -4 46 2 54 8 54 8 54 11 55 14 92 24 111 38 70 37 1 2 3 8 7 13 12 24 16 33 8 25 4 12 0 5 -5 -2 -24 -9 -23 -11 -22 -11 rrcurveto + -22 -11 -26 -6 -31 -1 -32 26 -28 36 -7 50 rrcurveto + endchar + + + 188 475 121 rmoveto + 3 8 62 119 -19 -7 -48 -18 -39 -29 -62 -2 -32 27 -26 36 -8 49 40 -4 34 -6 31 -10 42 130 rcurveline + -33 8 -29 8 -35 1 -86 2 -64 -204 50 -78 -38 -11 -93 -16 -40 10 -25 6 -14 32 4 30 rrcurveto + 3 -3 1 -3 -4 vhcurveto + -41 -57 -31 -106 66 -32 77 -38 309 125 51 27 rrcurveto + endchar + + + 392 499 330 rmoveto + 37 -4 35 -7 33 -10 42 129 rcurveline + -32 8 -28 9 -37 1 -52 1 -34 -67 -15 -44 -18 -52 -8 -74 28 -43 -59 -17 -103 -21 -74 -6 -69 -6 -93 -1 -13 49 -13 -35 -13 -42 -13 -50 1 -29 27 -14 28 -3 rrcurveto + 37 -4 48 2 57 8 57 8 58 12 59 15 99 25 123 38 74 40 1 2 3 8 7 13 12 23 16 35 8 25 4 12 0 5 -5 -2 -24 -9 -23 -11 -22 -11 rrcurveto + -22 -11 -27 -7 -31 -1 -31 27 -27 36 -8 50 rrcurveto + endchar + + + 122 242 421 rmoveto + 36 -3 35 -8 34 -10 42 130 rcurveline + -32 8 -28 8 -37 1 -52 1 -34 -66 -15 -44 -17 -52 -9 -75 28 -43 -40 -11 -31 -14 -21 -15 -21 -15 -22 -31 -20 -47 -20 -47 -8 -32 -10 -51 rrcurveto + -6 9 0 3 3 vhcurveto + 55 88 55 44 106 31 66 19 60 22 58 31 1 2 3 7 7 14 12 24 14 34 9 25 4 12 0 5 -5 -2 -24 -9 -23 -11 -22 -11 -22 -11 -26 -6 -31 -1 rrcurveto + -32 27 -27 35 -8 50 rrcurveto + endchar + + + 279 392 405 rmoveto + 37 -4 34 -7 33 -10 43 130 rcurveline + -32 8 -29 8 -37 1 -52 1 -33 -66 -15 -44 -17 -52 -10 -75 28 -43 -41 -11 -34 -21 -30 -29 -56 -55 -44 -74 -33 -75 -16 -37 -12 -31 -14 -24 -8 -16 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 33 39 30 28 26 17 52 33 50 13 65 18 31 8 37 17 44 23 1 2 3 8 7 13 rrcurveto + 11 23 16 34 8 25 4 12 0 5 -5 -2 -24 -9 -23 -11 -22 -11 -22 -11 -26 -6 -31 -1 -32 27 -26 35 -8 50 rrcurveto + endchar + + + 151 270 406 rmoveto + 35 -3 35 -7 35 -11 42 130 rcurveline + -32 7 -28 9 -37 1 -52 1 -34 -66 -15 -44 -18 -52 -9 -75 28 -43 -78 -22 -45 -40 -40 -68 -22 -38 -16 -41 -19 -42 21 -2 rcurveline + 14 33 18 26 24 18 60 45 76 19 84 30 32 11 31 11 28 10 28 10 17 7 6 3 1 2 3 8 7 13 12 24 15 33 8 25 4 12 0 5 -5 -2 rrcurveto + -24 -9 -23 -11 -22 -11 -22 -11 -26 -7 -31 -1 -31 27 -27 36 -8 50 rrcurveto + endchar + + + 314 280 387 rmoveto + 37 -4 35 -7 33 -10 42 130 rcurveline + -32 8 -28 8 -37 1 -52 1 -34 -66 -15 -44 -18 -52 -9 -75 28 -43 -15 -4 -18 -7 -21 -11 -30 -15 -26 -15 -23 -15 -46 -31 -34 -47 -17 -60 40 -30 rcurveline + 22 25 23 20 28 18 42 26 59 27 52 15 66 19 59 24 58 31 1 2 3 8 7 13 12 23 16 34 8 25 4 12 0 5 -5 -2 -24 -9 -23 -11 -22 -11 rrcurveto + -22 -11 -27 -6 -31 -1 -31 27 -27 35 -8 50 rrcurveto + endchar + + + 172 290 358 rmoveto + 34 -3 35 -7 36 -11 42 130 rcurveline + -32 7 -28 9 -37 1 rrcurveto + -1 hlineto + -21 -20 -11 -21 -17 hvcurveto + -33 -40 -26 -66 -70 vvcurveto + -29 6 -24 12 -18 vhcurveto + -15 -5 -21 -4 -26 -4 -1 -1 rcurveline + -3 -1 hlineto + -42 -10 -38 -15 -25 -26 -21 -22 -20 -30 -14 -32 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 34 34 36 9 48 14 114 26 97 27 96 51 1 2 3 8 7 13 12 24 15 34 8 25 rrcurveto + 2 5 1 4 3 vvcurveto + 2 0 1 -2 vhcurveto + -2 hlineto + -24 -9 -23 -11 -22 -11 -22 -11 -26 -6 -31 -1 -31 27 -27 35 -8 50 rrcurveto + endchar + + + 417 523 330 rmoveto + 36 -3 35 -7 34 -10 42 129 rcurveline + -32 8 -28 9 -37 1 rrcurveto + -1 hlineto + -21 -19 -11 -21 -17 hvcurveto + -33 -40 -26 -67 -70 vvcurveto + -29 6 -24 12 -18 vhcurveto + -50 -14 -54 -12 -56 -11 rrcurveto + -7 -38 -37 -4 -36 hhcurveto + -62 -45 7 42 -20 hvcurveto + -4 7 -2 10 10 vvcurveto + 29 14 40 26 52 vhcurveto + 1 2 0 1 1 vvcurveto + 2 -1 1 -1 vhcurveto + -2 hlineto + -2 -2 0 -2 -1 hvcurveto + -10 -14 -15 -24 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -43 10 50 -14 62 hhcurveto + 26 29 2 5 34 hvcurveto + 56 7 58 12 60 15 101 25 124 39 77 41 1 2 3 8 7 14 12 24 16 33 8 25 rrcurveto + 2 5 1 5 2 vvcurveto + 3 -1 1 -2 vhcurveto + 0 0 -1 -1 vhcurveto + -24 -9 -23 -11 -22 -11 -22 -11 -27 -6 -31 -1 -31 27 -27 35 -8 50 rrcurveto + endchar + + + 123 243 362 rmoveto + 34 -3 35 -7 36 -11 42 130 rcurveline + -32 7 -28 9 -37 1 -52 1 -34 -67 -15 -44 -18 -52 -9 -74 28 -43 -55 -15 -40 -25 -27 -34 -27 -35 -22 -38 -22 -44 19 -18 rcurveline + 14 19 17 15 19 12 40 25 12 5 56 19 55 19 73 24 55 20 29 10 17 7 6 3 1 2 3 8 7 13 12 23 15 35 8 25 4 12 1 5 -5 -2 rrcurveto + -24 -9 -24 -11 -22 -11 -22 -11 -26 -6 -31 -1 -31 27 -27 35 -8 50 rrcurveto + endchar + + + -78 372 351 rmoveto + -10 hlineto + -23 -19 -3 -4 -15 hvcurveto + -6 -5 -16 -17 -28 -33 rrcurveto + -25 -30 -13 -20 -11 -1 1 -1 -1 vvcurveto + 19 -66 -72 -12 -71 -12 -72 -12 rlinecurve + -1 -1 -21 -122 69 11 120 27 53 21 rlinecurve + 15 5 20 10 26 17 26 17 21 23 19 29 51 79 rcurveline + 8 12 6 16 7 19 rrcurveto + 2 6 1 5 6 vvcurveto + 35 -31 12 -41 1 vhcurveto + endchar + + + 42 361 59 rmoveto + 15 4 21 10 25 17 25 17 22 24 19 29 52 79 rcurveline + 7 12 7 15 7 19 15 45 -38 19 -47 1 -28 1 -22 -2 -17 -5 -6 -5 -16 -18 -28 -33 -28 -33 -12 -21 3 -9 20 -67 rcurveline + -58 -16 -91 -17 -73 4 -44 2 -42 10 -10 34 -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 91 -9 151 41 63 26 rrcurveto + endchar + + + -78 38 7 rmoveto + 73 -36 208 98 50 79 51 79 rcurveline + 15 24 22 46 -27 26 -21 20 -71 -1 -33 -10 -11 -9 -83 -91 6 -19 20 -66 rcurveline + -38 -6 -75 -18 -40 10 -26 7 -14 35 6 31 rrcurveto + 2 -1 0 -2 -2 vhcurveto + -42 -56 -35 -110 68 -33 rrcurveto + endchar + + + 103 422 64 rmoveto + 15 4 20 11 26 17 26 17 22 23 19 29 51 79 rcurveline + 8 12 7 16 6 19 6 19 -3 17 -14 13 -20 19 -75 -1 -31 -9 -6 -4 -16 -18 -28 -33 -28 -33 -12 -21 3 -10 20 -66 rcurveline + -46 -15 -95 -16 -64 -4 -68 -5 -92 2 -14 49 -13 -35 -13 -42 -13 -50 1 -30 27 -14 28 -3 49 -5 63 5 76 15 76 15 60 16 42 17 rrcurveto + endchar + + + -30 291 174 rmoveto + 15 4 19 11 26 17 26 17 21 23 19 29 51 79 rcurveline + 8 12 8 16 6 19 6 19 -4 17 -13 13 rrcurveto + 10 -11 -19 6 -28 hhcurveto + -28 -22 -2 -5 -17 hvcurveto + -6 -4 -17 -18 -28 -33 -28 -33 -12 -21 3 -10 20 -66 rcurveline + -61 -12 -42 -11 -26 -10 -26 -10 -31 -33 -37 -57 -35 -53 -21 -46 -7 -37 rrcurveto + -6 9 0 3 3 vhcurveto + 31 49 43 40 55 28 63 32 22 -3 65 26 rrcurveto + endchar + + + 145 465 168 rmoveto + 15 4 20 11 26 17 26 17 21 23 19 29 51 79 rcurveline + 8 12 7 16 6 19 15 45 -37 18 -47 1 -28 1 -22 -2 -17 -5 -6 -5 -16 -18 -28 -33 -28 -33 -12 -20 3 -10 19 -66 rcurveline + -71 -12 -52 -16 -34 -18 -34 -18 -35 -33 -38 -49 -70 -90 -16 -39 -47 -96 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 56 67 37 28 93 19 23 5 29 9 34 14 rrcurveto + endchar + + + 10 330 167 rmoveto + 15 4 19 11 26 17 26 17 22 24 19 29 51 79 rcurveline + 7 12 7 15 7 19 15 45 -37 19 -47 1 -28 1 -22 -2 -17 -5 -6 -4 -16 -19 -28 -33 -28 -33 -12 -21 3 -10 19 -66 rcurveline + -27 -5 -55 -13 -31 -9 -49 -13 -23 -5 -33 -31 -52 -47 -24 -73 -31 -69 21 -2 rcurveline + 16 36 27 29 37 22 65 38 91 12 73 30 rrcurveto + endchar + + + -70 252 118 rmoveto + 15 4 20 11 25 17 25 17 22 23 19 29 51 79 rcurveline + 7 12 7 16 6 19 6 19 -3 17 -13 13 -20 19 -73 -1 -32 -9 -6 -4 -16 -18 -27 -33 -27 -33 -12 -21 3 -10 19 -66 rcurveline + -32 -6 -30 -7 -26 -8 -86 -25 -45 -53 -29 -88 rrcurveto + -1 vlineto + 40 -30 21 25 26 22 26 16 rlinecurve + 60 36 14 -8 65 27 rrcurveto + endchar + + + -77 373 378 rmoveto + -10 hlineto + -24 -19 -2 -4 -15 hvcurveto + -6 -5 -17 -18 -27 -33 rrcurveto + -25 -30 -12 -20 -11 vvcurveto + -3 vlineto + 20 -65 -31 -6 1 1 -33 -6 -31 -5 -27 -3 rlinecurve + -27 -3 -27 -25 -30 -49 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 11 11 23 10 33 9 51 14 43 10 47 19 15 5 20 11 26 17 26 17 22 23 19 29 50 79 rcurveline + 8 12 7 15 7 19 rrcurveto + 2 6 1 6 6 vvcurveto + 35 -31 11 -41 1 vhcurveto + endchar + + + 160 617 361 rmoveto + -10 hlineto + -24 -19 -3 -4 -15 hvcurveto + -6 -5 -16 -17 -27 -33 rrcurveto + -25 -30 -13 -20 -11 vvcurveto + -3 vlineto + 20 -66 -46 -8 -55 -9 -63 -11 rlinecurve + -8 -45 -41 -4 -37 hhcurveto + -59 -41 9 40 -19 hvcurveto + -4 7 -2 10 10 vvcurveto + 29 14 40 26 52 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -24 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -21 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -42 9 49 -15 61 hhcurveto + 58 51 8 10 55 hvcurveto + 66 12 81 18 51 21 15 4 21 11 26 17 26 17 21 23 19 29 51 80 rcurveline + 8 12 6 15 7 19 rrcurveto + 2 6 1 5 6 vvcurveto + 35 -31 12 -41 1 vhcurveto + endchar + + + 2 321 155 rmoveto + 15 4 21 11 26 17 26 17 21 23 19 29 51 79 rcurveline + 8 12 7 16 6 19 15 45 -38 19 -47 1 rrcurveto + -28 -22 -2 -5 -17 hvcurveto + -6 -5 -16 -17 -28 -33 -28 -33 -12 -21 3 -10 20 -67 rcurveline + -49 -8 -77 -19 -44 -16 -43 -15 -38 -47 -20 -41 -13 -27 -15 -34 -18 -39 19 -8 rcurveline + 30 54 44 35 60 14 60 14 56 17 52 21 rrcurveto + endchar + + + 319 340 830 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + -134 -568 rmoveto + -117 -92 -114 -220 30 -142 55 -261 425 67 163 198 4 4 -12 -3 -5 -1 -175 -46 -260 -38 -136 153 -78 88 247 210 55 48 40 35 65 42 14 36 45 116 rcurveline + -60 -58 -97 -59 -47 46 -32 27 -16 25 -8 49 40 -4 34 -7 31 -10 42 130 rcurveline + -33 8 -29 8 -35 1 -99 2 -58 -206 91 -113 9 -12 10 -11 11 -10 rrcurveto + endchar + + + -116 73 569 rmoveto + 28 -425 74 118 -28 425 rlineto + endchar + + + -252 73 570 rmoveto + 39 -570 62 118 -38 569 rlineto + endchar + + + 30 354 564 rmoveto + -65 -120 34 -299 67 112 -8 108 -16 95 -12 104 rlinecurve + endchar + + + -116 131 744 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + -58 -175 rmoveto + 28 -425 74 118 -28 425 rlineto + endchar + + + -116 73 569 rmoveto + 28 -425 74 118 -28 425 rlineto + -9 -756 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + endchar + + + -116 293 845 rmoveto + 1 -2 3 -2 -2 vhcurveto + -46 -40 -101 -27 -76 39 -10 5 2 3 -10 -5 -36 -18 -22 -20 -20 -35 -40 -70 55 68 19 11 9 5 11 11 12 -6 72 -37 92 25 49 32 rrcurveto + -176 -219 rmoveto + 28 -425 74 118 -28 425 rlineto + endchar + + + 251 78 24 rmoveto + 157 -86 273 169 84 130 26 39 7 38 -25 27 -18 19 -33 -1 -28 8 -160 45 117 73 49 -15 20 32 11 39 17 36 rrcurveto + 9 4 -14 1 -4 hhcurveto + -35 -1 -28 -29 -19 -18 -42 -40 -83 -134 16 -56 15 -54 64 -20 67 -7 -60 -39 -69 -30 -83 -15 -69 -13 -90 2 -45 35 -103 81 104 151 39 81 4 8 -9 1 -3 -5 rrcurveto + -67 -94 -160 -272 173 -95 rrcurveto + endchar + + + 50 136 487 rmoveto + -2 -1 0 -2 -1 hvcurveto + -17 -23 -20 -34 -24 -42 -24 -42 -19 -44 -13 -46 rrcurveto + -9 -32 -5 -29 -30 vvcurveto + -70 21 -40 56 -30 vhcurveto + -16 29 33 -7 35 hhcurveto + 12 12 0 2 13 hvcurveto + 50 7 50 16 49 24 86 42 97 73 47 73 rrcurveto + 16 24 8 21 18 vvcurveto + 31 -23 23 -29 4 vhcurveto + -67 9 -63 27 -19 58 -15 -26 -12 -26 -10 -27 rrcurveto + -7 -18 -3 -16 -13 vvcurveto + -7 1 -5 2 -6 vhcurveto + 8 -27 17 -19 28 -12 28 -12 31 -8 34 -3 -64 -41 -71 -28 -78 -14 rrcurveto + -5 -25 -26 -2 -27 hhcurveto + -95 -74 33 88 21 3 23 7 22 hvcurveto + 16 52 37 60 21 44 rrcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 vhcurveto + endchar + + + 432 287 8 rmoveto + 135 -17 138 11 114 34 133 40 114 72 69 107 38 59 -10 54 -56 8 -70 10 -51 27 -33 48 -14 -25 -11 -24 -9 -25 -21 -61 24 -39 45 -19 28 -12 30 -7 34 -3 rrcurveto + -67 -44 -72 -29 -78 -14 -78 -14 -79 -10 -77 -6 -158 -2 -120 36 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 42 90 28 90 28 86 15 82 3 53 112 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 rrcurveto + endchar + + + 276 193 1 rmoveto + 102 8 93 43 70 48 61 42 24 35 35 57 6 9 9 16 10 20 5 10 4 9 5 10 7 14 3 28 -13 11 -24 18 -36 10 -33 8 -104 25 rcurveline + -1 vlineto + -18 -38 -20 -33 -16 -40 -5 -11 0 -7 6 -1 57 -12 53 -10 51 -19 8 -4 5 -3 1 -6 -2 -3 -3 -3 -6 -3 -36 -20 -36 -17 -36 -15 -63 -27 -75 -20 -90 6 rrcurveto + -39 3 -31 10 -22 18 -46 36 -9 52 21 67 16 52 37 61 21 44 4 8 -9 0 -3 -4 -17 -23 -20 -33 -24 -42 -24 -42 -19 -44 -13 -46 -13 -46 -4 -44 6 -42 rrcurveto + 11 -77 79 -50 99 8 rrcurveto + endchar + + + 429 287 7 rmoveto + 43 -6 52 -2 61 2 135 4 124 29 97 49 54 27 42 35 29 45 11 18 16 25 20 33 20 33 10 28 -1 21 -1 7 -3 6 -5 4 -18 14 -32 13 -45 10 rrcurveto + -45 10 -35 8 -23 6 rrcurveto + -1 vlineto + -19 -39 -18 -33 -17 -40 -5 -11 0 -7 6 -1 57 -12 53 -9 51 -19 7 -3 5 -4 2 -6 -2 -3 -3 -3 -6 -3 -72 -38 -70 -26 -67 -12 -67 -12 -78 -9 -87 -7 rrcurveto + -158 -2 -120 35 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 43 90 28 90 28 86 14 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 -122 92 -100 43 -47 76 -30 109 -14 rrcurveto + endchar + + + 719 287 9 rmoveto + 135 -17 138 12 114 34 133 40 114 72 69 107 28 44 3 34 -23 25 -18 19 -33 0 -28 8 -40 11 -25 12 -9 13 -9 13 0 13 7 11 11 17 41 21 30 -9 rrcurveto + 20 32 11 40 17 35 rrcurveto + 9 4 -12 1 -6 hhcurveto + -35 -2 -29 -28 -19 -17 -21 -21 -24 -36 -30 -53 -30 -53 -11 -40 8 -28 8 -27 18 -19 28 -12 28 -12 30 -8 34 -3 -67 -44 -72 -28 -78 -14 -78 -14 -79 -10 -77 -6 rrcurveto + -158 -2 -120 35 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 42 90 28 90 28 86 15 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 -122 92 -100 43 -47 76 -31 109 -14 rrcurveto + endchar + + + -116 29 757 rmoveto + 75 74 -46 -89 101 42 28 11 26 15 16 22 12 16 16 21 -15 18 -12 14 -27 -8 -11 -10 -23 -21 -22 -22 -20 -24 rrcurveto + -1 -3 -2 0 -2 hhcurveto + -35 42 -55 -64 -10 -40 -1 -4 8 6 2 2 rrcurveto + 182 90 rmoveto + 2 -3 1 -4 -4 -2 -20 -10 -24 -5 -25 -5 13 13 12 14 17 9 10 5 14 -4 4 -8 rrcurveto + -138 -278 rmoveto + 28 -425 74 118 -28 425 rlineto + endchar + + + -24 150 rmoveto + -5 -11 -6 -12 -5 -11 1 -6 2 -7 2 -5 14 -38 20 -33 2 -50 rrcurveto + -8 vlineto + -11 -1 -12 -2 -13 vhcurveto + -1 -1 0 0 vhcurveto + -1 1 -2 1 vhcurveto + 1 hlineto + 2 0 1 2 2 hvcurveto + 17 19 10 22 31 vvcurveto + 2 vlineto + 13 -2 12 -3 13 vhcurveto + -10 38 -18 35 -13 35 rrcurveto + 2 -1 -1 1 -2 hhcurveto + -1 hlineto + -3 -1 -1 -1 -3 vvcurveto + endchar + + + -243 66 630 rmoveto + -5 -11 -6 -12 -5 -11 1 -6 2 -7 2 -5 14 -38 20 -33 2 -50 rrcurveto + -8 vlineto + -11 -1 -12 -2 -13 vhcurveto + -1 -1 0 0 vhcurveto + -1 1 -2 1 vhcurveto + 1 hlineto + 2 0 1 2 2 hvcurveto + 17 19 10 22 31 vvcurveto + 2 vlineto + 13 -2 12 -3 13 vhcurveto + -10 38 -18 35 -13 35 rrcurveto + 2 -1 -1 1 -2 hhcurveto + -1 hlineto + -3 -1 -1 -1 -3 vvcurveto + endchar + + + 66 630 rmoveto + -5 -11 -6 -12 -5 -11 1 -6 2 -7 2 -5 14 -38 20 -33 2 -50 rrcurveto + -8 vlineto + -11 -1 -12 -2 -13 vhcurveto + -1 -1 0 0 vhcurveto + -1 1 -2 1 vhcurveto + 1 hlineto + 2 0 1 2 2 hvcurveto + 17 19 10 22 31 vvcurveto + 2 vlineto + 13 -2 12 -3 13 vhcurveto + -10 38 -18 35 -13 35 rrcurveto + 2 -1 -1 1 -2 hhcurveto + -1 hlineto + -3 -1 -1 -1 -3 vvcurveto + endchar + + + -24 150 rmoveto + -5 -11 -6 -12 -5 -11 1 -6 2 -7 2 -5 14 -38 20 -33 2 -50 rrcurveto + -8 vlineto + -11 -1 -12 -2 -13 vhcurveto + -1 -1 0 0 vhcurveto + -1 1 -2 1 vhcurveto + 1 hlineto + 2 0 1 2 2 hvcurveto + 17 19 10 22 31 vvcurveto + 2 vlineto + 13 -2 12 -3 13 vhcurveto + -10 38 -18 35 -13 35 rrcurveto + 2 -1 -1 1 -2 hhcurveto + -1 hlineto + -3 -1 -1 -1 -3 vvcurveto + endchar + + + 64 410 307 rmoveto + -10 1 rlineto + 55 -15 -34 105 -89 hhcurveto + -151 -81 -161 -138 -68 25 -113 81 60 60 50 44 36 hvcurveto + 65 78 11 -2 46 -134 rlineto + -25 6 25 -19 23 hhcurveto + 34 49 42 54 68 hvcurveto + -7 19 -10 1 rlineto + -21 -27 -35 -25 -25 hhcurveto + -48 -34 127 60 -16 hvcurveto + 1 92 138 46 69 vhcurveto + -51 23 rlineto + -155 -256 rmoveto + -72 -51 -58 -78 -58 hhcurveto + -69 -17 97 57 74 24 121 92 76 27 -87 -112 34 hvcurveto + endchar + + + 193 326 356 rmoveto + 3 23 23 2 23 hhcurveto + 22 23 0 -16 16 hvcurveto + 21 -21 15 -28 -30 vvcurveto + -48 -12 -49 -26 -38 vhcurveto + -84 86 -64 93 -48 106 17 8 74 43 30 28 rrcurveto + 33 30 14 37 44 vvcurveto + 55 -52 37 -50 -102 -61 -87 -91 -42 10 -42 16 -39 vhcurveto + -111 -68 -47 -43 -91 vvcurveto + -55 23 -54 39 -39 vhcurveto + -43 43 64 -12 60 hhcurveto + 58 55 28 32 40 hvcurveto + 5 -4 rlineto + -34 35 45 -25 50 hhcurveto + 109 43 106 89 16 hvcurveto + -21 5 rlineto + -64 -15 -30 -72 -71 hhcurveto + -40 -39 31 28 -26 hvcurveto + -3 3 rlineto + 41 53 33 60 67 vvcurveto + 21 -4 21 -5 21 vhcurveto + 49 57 0 -7 41 hvcurveto + 3 48 rlineto + -3 -30 -74 0 -52 hhcurveto + -67 -77 0 3 -56 hvcurveto + -78 36 rmoveto + -17 40 -11 41 43 vvcurveto + 46 5 58 60 32 35 -46 -35 -65 -21 -30 -83 -52 vhcurveto + 146 -367 rmoveto + -26 -32 -38 -11 -53 hhcurveto + -99 -67 94 93 63 21 50 68 45 hvcurveto + 46 -110 74 -109 80 -89 rrcurveto + endchar + + + 3 177 613 rmoveto + -54 43 -43 54 54 43 43 54 54 -43 43 -54 -54 -43 -43 -54 vhcurveto + 30 hmoveto + 37 30 30 37 37 30 -30 -37 -37 -30 -30 -37 -37 -30 30 37 vhcurveto + 71 -147 rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + 127 342 291 rmoveto + 25 -41 -50 31 -44 hhcurveto + -59 -36 -49 -58 -29 hvcurveto + 22 -12 rlineto + 53 29 21 24 40 hhcurveto + 29 27 -13 -15 24 hvcurveto + 99 -63 rlineto + -20 31 36 -16 38 hhcurveto + 55 37 49 48 20 hvcurveto + -21 11 rlineto + -37 -20 -20 -30 -40 hhcurveto + -27 -25 12 14 -22 hvcurveto + endchar + + + -244 175 448 rmoveto + -8 36 -2 33 -1 35 26 -20 24 -22 17 -19 26 29 rcurveline + -28 13 -29 20 -31 23 28 20 28 17 32 15 -25 31 rcurveline + -20 -21 -23 -21 -25 -20 2 33 2 29 7 33 rrcurveto + -40 hlineto + 8 -33 0 -31 -32 vvcurveto + -25 19 -21 19 -22 21 -27 -28 rcurveline + 29 -15 27 -16 29 -21 -26 -18 -27 -18 -34 -17 21 -35 rcurveline + 24 28 26 23 27 21 -1 -43 -2 -30 -6 -38 rrcurveto + endchar + + + 183 472 371 rmoveto + 16 -25 -35 8 -25 hhcurveto + -132 -56 -97 -99 -64 29 -74 88 46 44 22 22 39 hvcurveto + 12 -3 rlineto + -24 4 11 -17 29 hhcurveto + 34 61 34 27 24 hvcurveto + 39 39 27 53 5 63 14 185 -185 137 -175 -34 -109 -21 -98 -87 -52 -86 -56 -92 -9 -122 57 -98 44 -76 83 -68 105 -8 43 42 rcurveline + -14 15 -67 5 -58 28 -42 39 rlinecurve + -98 105 6 189 91 109 42 35 50 25 53 10 168 32 163 -114 -13 -178 rrcurveto + -54 -4 -23 -90 -63 hhcurveto + -27 -2 29 17 hvcurveto + 27 -1 28 27 vvcurveto + 52 0 52 4 52 vhcurveto + -4 4 rlineto + -59 -255 rmoveto + -15 -23 -29 -16 -32 hhcurveto + -29 -32 6 23 -17 hvcurveto + -18 24 -6 31 1 29 1 71 24 38 18 15 rrcurveto + 18 21 26 9 29 hhcurveto + 20 19 -10 -13 14 hvcurveto + 13 -12 0 -19 -18 vvcurveto + endchar + + + 3 272 658 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + -41 -171 rmoveto + -170 -68 -140 -141 -90 36 -107 111 58 56 31 32 49 hvcurveto + 15 -4 rlineto + -34 6 14 -25 37 hhcurveto + 32 54 34 24 40 hvcurveto + -7 24 rlineto + -8 -21 -30 -10 -14 hhcurveto + -54 15 125 62 73 2 72 4 73 hvcurveto + -5 5 -53 -31 rlineto + 23 -32 -43 12 -32 hhcurveto + -21 -412 rmoveto + -37 -41 8 33 -21 hvcurveto + -23 35 -6 43 1 42 2 101 29 55 23 22 rrcurveto + 25 26 33 13 36 hhcurveto + 25 25 -14 -19 18 hvcurveto + 16 -17 0 -26 -26 vvcurveto + -230 vlineto + -23 -30 -37 -22 -39 hhcurveto + endchar + + + -23 -14 640 rmoveto + 86 -13 8 7 -35 vvcurveto + -476 vlineto + -111 66 -22 51 114 117 80 107 35 vhcurveto + 14 43 5 44 44 vvcurveto + 84 -48 76 -93 -68 -58 -34 -40 -53 vhcurveto + -9 5 rlineto + 33 vlineto + 82 6 81 8 82 vhcurveto + -6 7 -169 -18 -6 -5 rlineto + 171 -314 rmoveto + 34 39 45 25 53 hhcurveto + 38 24 -23 -20 13 hvcurveto + 14 -21 16 -42 -73 vvcurveto + -92 -41 -97 -106 -88 -11 78 113 39 2 45 2 34 vhcurveto + endchar + + + -155 404 -184 rmoveto + 3 13 -388 893 -31 -7 -5 -11 389 -896 rlineto + endchar + + + -329 128 738 rmoveto + -40 -8 rlineto + -897 vlineto + 40 8 rlineto + endchar + + + 437 619 342 rmoveto + 13 -34 19 -64 -1 -23 rrcurveto + 0 -194 -97 -150 -87 -79 31 85 4 vhcurveto + 3 60 37 57 8 15 4 8 -8 5 -11 -16 rrcurveto + -54 -81 -37 -81 -55 vvcurveto + -165 178 14 11 166 205 106 108 53 vhcurveto + 60 120 -63 121 0 vvcurveto + -309 -579 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + endchar + + + 437 619 342 rmoveto + 13 -34 19 -64 -1 -23 rrcurveto + 0 -194 -97 -150 -87 -79 31 85 4 vhcurveto + 3 60 37 57 8 15 4 8 -8 5 -11 -16 rrcurveto + -54 -81 -37 -81 -55 vvcurveto + -165 178 14 11 166 205 106 108 53 vhcurveto + 60 120 -63 121 0 vvcurveto + endchar + + + 126 489 43 rmoveto + -1 -5 -1 -4 -3 vvcurveto + -4 1 -1 2 vhcurveto + 1 hlineto + 25 26 20 31 15 35 15 35 13 31 6 22 rrcurveto + 1 2 27 -6 -14 vhcurveto + -9 -20 -16 -20 -19 -10 rrcurveto + -36 -69 -144 -7 -36 hhcurveto + -174 -46 45 71 3 hvcurveto + 2 41 13 38 24 45 9 22 -18 7 -11 -17 -24 -39 -24 -44 -23 -51 rrcurveto + -13 -30 -6 -29 -27 vvcurveto + -161 204 2 41 84 103 20 23 57 vhcurveto + endchar + + + 485 287 7 rmoveto + 96 -12 95 3 95 19 95 19 91 27 89 36 -5 -12 1 -6 6 1 25 27 19 30 15 35 15 35 11 30 7 23 rrcurveto + 1 2 1 3 6 vvcurveto + 6 -2 1 -4 -5 vhcurveto + -9 -22 -13 -15 -20 -11 -56 -31 -71 -23 -84 -15 -84 -15 -75 -10 -63 -5 -158 -2 -120 36 -84 73 -32 27 -15 24 2 20 2 20 11 19 18 17 61 58 75 42 90 28 rrcurveto + 90 28 86 15 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -38 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 rrcurveto + endchar + + + -70 252 393 rmoveto + -77 -113 rlineto + 17 -58 9 -36 -14 vvcurveto + -19 -13 -21 -9 -24 -6 -24 -6 -38 -7 -52 -6 rrcurveto + -1 hlineto + -22 -125 40 4 35 6 28 8 rlinecurve + 66 19 41 46 34 57 42 69 -4 101 -30 83 rrcurveto + endchar + + + 128 369 266 rmoveto + 14 -40 7 -31 -1 -21 -47 -20 -85 -20 -66 -5 -64 -5 -75 5 -13 47 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 39 -4 45 2 51 6 51 6 44 14 37 20 rrcurveto + 78 40 54 86 12 100 2 16 -3 22 -7 30 -7 30 -3 13 -3 -4 rrcurveto + endchar + + + -51 301 245 rmoveto + -3 2 -17 -46 -26 -29 -34 -12 rlinecurve + -34 -12 -67 -9 -102 -5 -18 -134 rcurveline + 94 6 67 14 40 23 32 18 24 32 17 43 rrcurveto + 17 43 10 36 30 vvcurveto + endchar + + + 9 355 253 rmoveto + 3 -2 1 -1 -2 vhcurveto + -31 -85 -144 -53 -93 24 -27 7 -12 36 6 31 rrcurveto + 1 -1 2 -2 -3 vhcurveto + -43 -56 -35 -111 68 -33 126 -61 188 136 3 163 rrcurveto + endchar + + + 195 433 279 rmoveto + 14 -39 6 -31 -1 -22 -52 -23 -104 -24 -73 -8 -74 -8 -95 -1 -15 52 -13 -35 -13 -42 -13 -50 1 -29 27 -14 28 -3 39 -4 55 2 69 10 114 16 71 27 57 66 rrcurveto + 39 46 23 56 7 64 2 16 -2 22 -7 30 -7 30 -4 13 -3 -4 rrcurveto + endchar + + + 59 1 hmoveto + 73 hlineto + 14 15 15 15 16 14 32 28 38 22 45 15 19 5 20 1 23 -2 11 -2 12 -1 5 9 18 34 14 39 15 37 -5 6 rcurveline + -30 12 -34 -3 -39 -18 rrcurveto + -1 hlineto + -1 -3 -2 -1 -2 hhcurveto + -54 -22 -46 -30 -39 -37 -39 -37 -28 -30 -18 -24 -18 -24 -10 -15 -2 -5 rrcurveto + endchar + + + 195 377 176 rmoveto + 24 10 28 3 29 -3 11 -2 12 -1 5 9 19 34 13 39 15 37 -5 6 rcurveline + -24 10 -29 0 -32 -11 -32 -11 -31 -15 -32 -21 -53 -35 -63 -57 -36 -46 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 50 59 57 61 77 30 rrcurveto + endchar + + + 3 288 149 rmoveto + 8 21 12 30 17 38 17 38 -1 25 -21 12 -33 19 -33 1 -31 -17 -66 -36 -54 -73 -37 -69 -20 -37 -15 -30 -10 -21 -8 -18 -6 -12 -2 -7 -2 -7 -2 -5 -1 -1 rrcurveto + 18 hlineto + 14 22 18 28 23 33 23 33 25 27 26 23 26 23 26 12 25 2 25 2 21 -18 18 -38 rrcurveto + endchar + + + 314 235 214 rmoveto + -5 vlineto + -25 -20 -28 -14 -31 -10 -60 -19 -69 -59 -22 -56 46 -32 rcurveline + 1 2 2 1 2 1 40 29 43 26 45 25 25 14 20 19 17 25 19 29 13 27 8 24 rrcurveto + 12 30 5 31 34 vvcurveto + 1 61 -19 49 -38 37 -63 -111 rcurveline + 19 -29 14 -26 8 -23 rrcurveto + -1 vlineto + 5 -15 8 -30 2 -14 rrcurveto + endchar + + + -41 308 229 rmoveto + -17 -16 -29 -9 -27 -4 -28 -6 -28 -4 -25 -4 -61 -9 -39 -33 -21 -53 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 11 17 20 20 25 12 23 4 24 4 30 7 35 9 76 19 34 54 7 87 rrcurveto + endchar + + + 279 520 234 rmoveto + -2 vlineto + -63 -30 -74 -36 -83 -19 -91 -17 rlinecurve + -4 -19 -17 -2 -16 hhcurveto + -53 -37 20 53 30 14 42 29 57 hvcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -43 9 51 -14 61 hhcurveto + 27 30 3 6 31 hvcurveto + 50 9 48 16 47 21 82 37 91 59 36 75 rrcurveto + 20 41 10 37 35 vvcurveto + 19 -3 18 -6 17 vhcurveto + -24 74 -76 -113 rlineto + 10 -29 21 -57 -34 vvcurveto + endchar + + + -187 105 87 rmoveto + -22 -18 -47 -17 -29 -10 -7 -17 rcurveline + 98 -25 19 25 24 41 10 33 rlinecurve + 12 30 6 31 34 vvcurveto + 60 -19 50 -37 37 vhcurveto + -64 -112 20 -30 15 -26 7 -22 rlinecurve + 5 -14 8 -31 2 -14 rrcurveto + -1 -2 0 -1 -2 vvcurveto + endchar + + + 674 287 7 rmoveto + 49 -6 57 -2 65 3 143 6 130 36 97 58 53 32 39 42 25 51 30 62 7 56 -16 49 rrcurveto + -24 74 0 0 0 vvcurveto + -77 -114 10 -28 23 -60 -2 -33 rlinecurve + 0 -1 0 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -7 -72 -16 -80 -8 -80 -6 -157 -2 -120 36 -85 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 42 90 28 90 28 86 14 82 3 53 113 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 rrcurveto + endchar + + + -158 205 24 rmoveto + 1 hlineto + 50 53 28 81 15 47 2 3 -1 21 -5 -11 -7 -17 -17 -24 -25 -11 -53 -23 -147 -14 -25 -2 -21 -127 rcurveline + 58 6 99 16 46 19 -2 -7 -1 -11 5 1 rrcurveto + endchar + + + -17 348 25 rmoveto + 25 26 19 31 15 35 15 35 11 30 7 23 rrcurveto + 1 2 0 4 6 vvcurveto + 6 -1 1 -3 -5 vhcurveto + -10 -22 -14 -17 -19 -10 -24 -13 -41 -11 -58 -7 -58 -7 -42 -5 -25 1 -48 1 -48 10 -11 36 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 36 -3 48 3 62 8 rrcurveto + 62 8 48 11 34 14 -5 -12 1 -6 6 1 rrcurveto + endchar + + + -136 226 35 rmoveto + -7 -23 16 2 7 12 32 60 34 68 13 43 2 3 1 21 -7 -10 -8 -21 -15 -17 -19 -11 -29 -16 -111 -26 -49 12 rrcurveto + -26 7 -8 33 30 vvcurveto + 7 1 1 -6 -7 vhcurveto + -46 -53 -28 -111 67 -33 42 -20 114 37 30 12 rrcurveto + endchar + + + 31 56 1 rmoveto + 40 -4 58 3 76 11 76 11 54 12 34 14 -4 -12 1 -6 5 1 25 26 20 31 15 35 15 35 11 29 7 23 rrcurveto + 1 2 0 4 6 vvcurveto + 6 -1 1 -4 -5 vhcurveto + -9 -22 -14 -16 -20 -11 -21 -12 -41 -10 -64 -9 -64 -9 -45 -5 -28 -1 -60 -3 -67 6 -13 43 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 rrcurveto + endchar + + + 88 12 2 rmoveto + 23 36 18 30 14 21 14 21 25 27 37 30 35 29 38 22 41 15 30 12 21 -21 9 -18 5 -16 11 -8 17 1 rrcurveto + 4 7 3 2 8 hvcurveto + 62 134 -33 -5 rlineto + -2 -1 0 1 -2 hvcurveto + 15 -12 -9 28 -27 hhcurveto + -26 -28 -7 -14 -31 hvcurveto + -59 -28 -58 -49 -43 -45 -26 -26 -23 -28 -21 -26 -13 -32 -14 -63 -3 -38 rrcurveto + -6 9 0 3 3 vhcurveto + endchar + + + 208 237 76 rmoveto + 36 39 52 50 54 15 23 6 18 -9 12 -24 4 -16 10 -8 18 1 6 1 7 2 6 2 62 134 rcurveline + -33 -5 -5 2 -25 31 -27 14 -30 -4 rlinecurve + -30 -4 -30 -12 -29 -21 -29 -21 -26 -26 -25 -29 -25 -29 -20 -24 -15 -19 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 23 54 52 64 51 56 rrcurveto + endchar + + + -38 223 179 rmoveto + -50 -21 -55 -14 -60 -11 -58 -133 rcurveline + 28 7 27 7 27 7 106 28 73 67 25 102 17 62 2 57 -11 53 -11 53 -7 25 -2 -3 -76 -113 rcurveline + 18 -69 7 -29 -75 vvcurveto + endchar + + + -128 215 293 rmoveto + 9 -114 -47 -20 -56 -12 -56 -10 rlinecurve + -65 -137 156 50 29 16 24 19 20 22 rlinecurve + 8 -107 74 117 -22 294 rlineto + endchar + + + -77 185 141 rmoveto + 27 10 21 -10 14 -29 4 -16 10 -7 18 1 6 1 7 1 6 2 63 135 rcurveline + -33 -5 -6 1 -18 23 -21 15 -21 5 rlinecurve + -20 4 -19 -3 -20 -9 -20 -9 -19 -13 -19 -18 -55 -53 -56 -87 -34 -72 30 -8 rcurveline + 39 55 49 60 67 26 rrcurveto + endchar + + + -123 304 354 rmoveto + 3 -2 1 -3 -1 vhcurveto + -4 -2 -3 -3 -3 -7 -14 -34 -39 -32 -64 -28 -62 -27 -51 -10 -41 6 -18 -133 rcurveline + 28 7 27 7 27 7 62 16 48 28 37 43 13 -195 rcurveline + 73 128 -6 74 -7 74 2 78 rlinecurve + endchar + + + -105 240 114 rmoveto + 4 -16 10 -8 18 1 2 1 8 1 10 3 62 134 rcurveline + -33 -5 rlineto + 1 -3 -2 1 -1 hhcurveto + 15 -12 -9 27 -27 hhcurveto + -37 -33 -10 -18 -28 hvcurveto + -28 -18 -25 -22 -22 -25 -11 -13 -18 -24 -23 -34 -23 -34 -14 -25 -5 -14 47 -32 rcurveline + 1 vlineto + 17 24 20 27 23 30 23 30 23 19 26 10 30 12 22 -21 9 -18 rrcurveto + endchar + + + -40 307 31 rmoveto + 2 123 -30 -4 -24 9 4 31 rlinecurve + 1 28 -83 -24 -43 -13 -52 -16 -31 -18 -11 -21 -12 -23 -7 -27 -10 -24 -1 -1 -10 -17 1 -2 -7 -28 22 -17 18 26 11 11 13 10 12 7 21 8 27 7 30 7 rrcurveto + 30 7 14 -1 -1 -11 -5 -31 12 -13 27 4 27 4 28 4 27 5 rrcurveto + endchar + + + 124 106 333 rmoveto + -2 -1 -1 -2 -1 hvcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -41 9 44 -15 60 hhcurveto + 60 52 8 9 57 hvcurveto + 66 11 85 16 49 21 rrcurveto + -1 -5 -1 -3 -3 vvcurveto + -4 1 -2 3 vhcurveto + 25 27 20 30 15 35 15 35 11 30 7 23 rrcurveto + 1 2 0 3 6 vvcurveto + 4 0 2 -1 -1 -1 -2 -2 -2 vhcurveto + -9 -21 -14 -17 -20 -11 rrcurveto + -32 -92 -129 -31 -120 hhcurveto + -57 -38 8 35 -21 hvcurveto + -5 8 -3 11 12 vvcurveto + 29 13 41 27 52 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 1 -2 vhcurveto + endchar + + + -106 281 264 rmoveto + 1 1 -8 4 -11 1 -14 -2 rlinecurve + -45 -5 -40 -18 -33 -32 -58 -55 -45 -67 -28 -84 21 -7 rcurveline + 39 55 50 60 67 26 11 4 10 1 10 -4 rrcurveto + -1 vlineto + 13 -4 11 -10 7 -15 4 -16 11 -7 17 1 5 1 7 1 8 2 62 135 rcurveline + -34 -5 rlineto + 0 -1 0 -4 1 vhcurveto + -10 12 -7 19 -15 8 rrcurveto + endchar + + + -15 325 392 rmoveto + 65 25 58 71 75 vvcurveto + 75 -61 60 -75 -106 -71 -57 -81 -38 vhcurveto + -22 -47 -8 -78 -2 -51 -8 -190 4 -191 -5 -190 12 -15 rcurveline + 76 33 rlineto + -7 125 -2 126 126 vvcurveto + 186 -6 64 22 87 vhcurveto + 61 15 35 45 68 hhcurveto + 60 41 -55 -56 -106 -80 -48 -89 hvcurveto + -2 -36 rlineto + 2 21 21 0 21 hhcurveto + 98 67 -57 -101 -74 -36 -99 -84 -38 -34 31 38 hvcurveto + 7 vlineto + -13 6 -49 -69 rlineto + -35 20 36 -14 38 hhcurveto + 129 116 79 138 48 -20 50 -34 35 hvcurveto + -30 31 -55 12 -49 2 rrcurveto + endchar + + + -232 303 -154 rmoveto + -97 -36 2 182 91 7 120 -92 32 hvcurveto + 1 vlineto + 64 23 21 88 133 vvcurveto + 66 -4 101 50 13 vhcurveto + 7 27 31 1 29 hhcurveto + 24 vlineto + -160 -24 -1 -215 -93 6 -88 -32 -28 hvcurveto + -19 -22 -24 -1 -39 hhcurveto + -26 vlineto + 31 37 -2 -21 19 hvcurveto + 25 -28 0 -105 -69 vvcurveto + -101 -8 -85 75 -20 vhcurveto + -6 24 53 0 39 hhcurveto + endchar + + + -232 10 -175 rmoveto + 149 34 -1 213 104 -3 101 61 15 hvcurveto + 17 4 19 2 18 -1 rrcurveto + 26 vlineto + -107 -4 36 193 114 6 30 -32 40 hvcurveto + -27 34 -53 -3 -78 1 rrcurveto + -24 vlineto + 62 50 4 -74 15 hvcurveto + 12 -79 -10 -81 11 -81 9 -68 32 -40 37 -13 rrcurveto + -1 vlineto + -92 -33 7 -123 -87 vvcurveto + -67 3 -98 -56 -13 vhcurveto + -6 -23 -30 0 -27 hhcurveto + endchar + + + -287 247 736 rmoveto + -54 -66 0 5 -39 hvcurveto + -866 vlineto + 5 52 53 0 54 hhcurveto + 24 vlineto + -119 13 rlineto + 782 vlineto + 119 13 rlineto + endchar + + + -287 130 -83 rmoveto + -119 -13 rlineto + -24 vlineto + 54 53 0 -5 52 hvcurveto + 866 vlineto + -5 -39 -66 0 -54 hhcurveto + -24 vlineto + 119 -13 rlineto + endchar + + + -337 124 738 rmoveto + -40 -8 rlineto + -403 vlineto + 40 8 rlineto + -91 vmoveto + -40 -8 rlineto + -403 vlineto + 40 8 rlineto + endchar + + + -213 69 265 rmoveto + -54 43 -43 54 54 43 43 54 54 -43 43 -54 -54 -43 -43 -54 vhcurveto + endchar + + + -90 425 116 rmoveto + -38 -44 -50 -31 -59 hhcurveto + -117 -24 115 86 88 45 100 85 43 33 -39 -67 9 hvcurveto + 17 -6 54 53 rlineto + 57 -6 -45 41 -65 hhcurveto + -148 -105 -108 -150 -99 10 -137 163 89 73 54 61 62 hvcurveto + -11 18 rlineto + endchar + + + -90 180 -122 rmoveto + 37 -11 50 -31 -28 -38 -14 -18 -32 -14 -26 -10 -5 -10 rcurveline + 6 -15 55 10 70 18 33 44 rlinecurve + 26 36 -9 36 -23 28 -19 23 -40 18 -13 5 15 36 rcurveline + 71 14 59 46 52 51 -11 18 rcurveline + -9 2 rlineto + -38 -44 -50 -31 -59 hhcurveto + -117 -24 115 86 88 45 100 85 43 33 -39 -67 9 hvcurveto + 17 -6 54 53 rlineto + 57 -6 -45 41 -65 hhcurveto + -148 -105 -108 -150 -99 10 -137 163 hvcurveto + 1 2 0 1 hhcurveto + endchar + + + -25 188 -112 rmoveto + 37 -11 50 -31 -28 -38 -14 -18 -32 -14 -26 -10 -5 -10 rcurveline + 6 -15 55 10 70 18 33 44 rlinecurve + 26 36 -9 36 -23 28 -19 23 -40 18 -13 5 20 47 rcurveline + -36 hlineto + endchar + + + -545 -72 -112 rmoveto + 37 -11 50 -31 -28 -38 -14 -18 -32 -14 -26 -10 -5 -10 rcurveline + 6 -15 55 10 70 18 33 44 rlinecurve + 26 36 -9 36 -23 28 -19 23 -40 18 -13 5 20 47 rcurveline + -36 hlineto + endchar + + + -84 418 116 rmoveto + -38 -44 -50 -31 -59 hhcurveto + -2 388 hlineto + 39 -5 29 -38 8 -62 17 -6 rcurveline + 54 53 rlineto + 57 -6 -45 41 -65 hhcurveto + -11 -10 -1 -1 -10 hvcurveto + 169 vlineto + -40 -8 rlineto + -168 vlineto + -109 -29 -73 -95 -125 vvcurveto + -99 10 -137 163 vhcurveto + 3 3 0 3 hhcurveto + -148 vlineto + 40 8 rlineto + 146 vlineto + 67 15 58 45 50 49 -11 18 rcurveline + -303 134 rmoveto + 77 34 85 65 21 vhcurveto + -378 vlineto + -81 24 -18 96 75 vvcurveto + endchar + + + -20 284 206 rmoveto + -90 192 rlineto + 30 -14 -23 38 -37 hhcurveto + -25 -25 -8 -15 -19 hvcurveto + -63 -48 15 -21 rlineto + 15 19 28 22 18 hhcurveto + 29 22 -34 -28 14 hvcurveto + 35 -72 74 -142 -1 vvcurveto + -74 -96 -69 -99 -68 -100 50 -30 rcurveline + 17 6 36 91 60 89 58 88 rlinecurve + 10 hlineto + -147 62 42 -133 66 hhcurveto + 41 54 32 25 43 hvcurveto + -8 23 rlineto + -11 -21 -24 -4 -24 hhcurveto + -62 -70 170 118 -53 hvcurveto + 15 21 17 19 16 19 179 206 rcurveline + -1 7 -33 32 -20 -4 -187 -250 rlineto + endchar + + + -45 103 511 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + endchar + + + -545 -163 511 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + endchar + + + -361 35 398 rmoveto + -31 26 -26 32 31 25 26 31 31 -25 26 -31 -32 -26 -26 -31 vhcurveto + -353 vmoveto + -31 26 -26 32 31 25 26 31 31 -25 26 -31 -32 -26 -26 -31 vhcurveto + endchar + + + -312 77 -210 rmoveto + 71 82 33 51 50 vvcurveto + 35 -35 130 -53 -25 -34 -22 -26 -10 3 -11 4 -5 vhcurveto + 70 -83 rlineto + 9 -11 4 -17 -14 vvcurveto + -40 -31 -49 -35 -46 vhcurveto + endchar + + + -86 127 hmoveto + 60 29 52 91 4 hvcurveto + 8 -8 6 -7 -7 vhcurveto + -103 -99 8 172 23 85 17 64 9 37 2 10 -31 -30 rcurveline + -33 -94 -28 -95 -7 -72 rrcurveto + -77 -8 32 -51 41 hhcurveto + endchar + + + -86 127 219 rmoveto + -41 -32 -51 -77 8 hvcurveto + 7 -72 28 -95 33 -94 31 -30 rcurveline + -2 10 -9 37 -17 64 -23 85 -8 172 103 -99 rrcurveto + 7 -7 8 6 8 vvcurveto + 91 -4 -29 52 -60 hhcurveto + endchar + + + 87 45 437 rmoveto + -150 121 -121 150 150 121 121 150 150 -121 121 -150 -150 -121 -121 -150 vhcurveto + 25 hmoveto + 136 110 110 136 136 110 -110 -136 -136 -110 -110 -136 -136 -110 110 136 vhcurveto + 413 126 rmoveto + 42 -31 -46 14 -52 hhcurveto + -63 -60 -18 -36 -44 hvcurveto + -42 -35 -13 -49 -48 vvcurveto + -49 16 -49 42 -35 vhcurveto + -28 34 49 -10 48 hhcurveto + 52 48 22 24 43 hvcurveto + -10 14 rlineto + -19 -34 -37 -15 -41 hhcurveto + -49 -26 14 28 -33 hvcurveto + -20 16 -28 50 46 vvcurveto + 44 11 49 36 31 vhcurveto + 22 26 38 11 36 hhcurveto + 49 39 -20 -45 20 hvcurveto + 8 hlineto + endchar + + + 45 75 484 rmoveto + 49 -49 rlineto + -30 -34 -12 -36 -52 vvcurveto + -50 12 -35 30 -38 vhcurveto + -49 -49 45 -45 48 48 rlineto + -30 37 37 -12 53 hhcurveto + 53 37 12 30 37 hvcurveto + 48 -48 45 45 -49 49 rlineto + 30 38 12 35 50 vvcurveto + 52 -12 36 -30 34 vhcurveto + 49 49 -47 47 -48 -48 rlineto + 28 -38 -39 13 -48 hhcurveto + -48 -40 -13 -28 -37 hvcurveto + -48 48 rlineto + 176 -66 rmoveto + 81 70 -70 -82 -84 -69 -68 -85 -85 -69 68 85 83 70 68 87 hvcurveto + endchar + + + 6 269 638 rmoveto + 33 47 -1 -35 11 hvcurveto + 7 -26 -1 -72 1 -53 -7 -4 rcurveline + 9 -27 -27 6 -29 hhcurveto + -162 -75 -142 -140 -89 35 -109 114 59 64 37 35 51 hvcurveto + -35 2 18 -38 39 hhcurveto + 39 51 36 27 39 hvcurveto + -8 23 rlineto + -8 -20 -31 -11 -10 hhcurveto + -30 -6 33 29 -2 hvcurveto + 565 vlineto + -8 9 -163 -20 -5 -4 rlineto + 95 -565 rmoveto + -27 -27 -56 -20 -35 hhcurveto + -90 -28 85 70 94 34 131 112 83 11 -64 -54 hvcurveto + endchar + + + 517 689 794 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -340 -668 rmoveto + 34 49 25 56 12 58 33 5 49 10 40 10 87 22 90 51 53 71 34 45 45 59 -42 50 -34 40 -77 -20 -31 -29 rrcurveto + -110 -105 -71 -86 0 vvcurveto + -59 -13 3 32 -33 73 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 -64 -59 -124 -59 -93 33 -105 37 86 143 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 rrcurveto + 372 373 rmoveto + 4 -8 6 -13 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 39 -13 12 -22 rrcurveto + endchar + + + 3 242 311 rmoveto + 14 -40 18 -55 -1 -26 -50 -22 -89 -24 -60 -11 -74 -133 rcurveline + 56 15 105 22 46 24 29 15 25 22 21 24 rrcurveto + 122 145 -85 158 0 vvcurveto + endchar + + + 26 374 164 rmoveto + -5 -5 -2 -4 -4 hvcurveto + -14 -13 -17 -8 -18 -3 -99 -16 -109 -1 -93 -23 rrcurveto + -7 -2 -3 -3 -3 vvcurveto + -2 1 -1 2 -2 vhcurveto + 8 -7 25 -13 42 -18 42 -18 26 -10 11 -3 rrcurveto + -8 25 24 -4 21 hhcurveto + 45 24 18 38 25 hvcurveto + 15 24 18 26 22 16 rrcurveto + 8 3 6 10 12 vvcurveto + 9 -5 8 -11 vhcurveto + endchar + + + 79 80 rmoveto + 7 22 4 18 14 vvcurveto + 23 -8 18 -20 -5 -5 -2 -2 -5 vhcurveto + -22 -9 -32 -33 -29 vvcurveto + -28 28 -15 19 -11 vhcurveto + -6 -6 -8 -7 -10 -7 -41 -29 -51 -32 -42 -27 rrcurveto + -7 -4 -2 -2 -1 vvcurveto + 6 1 81 20 55 27 43 58 rlinecurve + 7 -5 6 -1 5 -7 rrcurveto + 8 12 7 11 14 vvcurveto + 1 vlineto + -1 9 -5 5 -6 4 rrcurveto + -37 54 rmoveto + 3 hlineto + 12 5 -11 -14 -6 0 -6 -2 -8 hvcurveto + -10 5 -27 10 14 vvcurveto + 9 11 6 8 1 vhcurveto + endchar + + + -36 26 rmoveto + -7 -22 -4 -18 -14 vvcurveto + -23 8 -18 20 5 5 2 2 5 vhcurveto + 22 9 32 33 29 vvcurveto + 28 -28 15 -19 11 vhcurveto + 6 6 8 7 10 7 41 29 51 32 42 27 rrcurveto + 7 4 2 2 1 vvcurveto + -6 -1 -81 -20 -55 -27 -43 -58 rlinecurve + -7 5 -6 1 -5 7 rrcurveto + -8 -12 -7 -11 -14 vvcurveto + -1 vlineto + 1 -9 5 -5 6 -4 rrcurveto + 37 -54 rmoveto + -3 hlineto + -12 -5 11 14 6 0 6 2 8 hvcurveto + 10 -5 27 -10 -14 vvcurveto + -9 -11 -6 -8 -1 vhcurveto + endchar + + + 53 -9 rmoveto + 7 22 2 16 -1 9 -2 12 -6 1 -7 -8 -3 -2 -2 -3 -3 -4 rrcurveto + -18 -12 -12 -8 -11 hhcurveto + -9 3 -7 5 -4 7 rrcurveto + 1 hlineto + -4 11 -1 19 2 15 8 42 18 58 18 33 3 7 3 5 1 2 1 4 0 2 -2 -2 -3 -1 -2 -2 -2 -2 -22 -25 -15 -25 -15 -39 -21 -54 -9 -32 8 -69 rrcurveto + -27 3 15 -13 28 hhcurveto + 24 20 20 41 13 hvcurveto + endchar + + + 47 280 rmoveto + -79 -25 -65 -52 -33 -72 -19 -32 -5 -53 29 -24 24 -20 32 9 22 15 23 49 rcurveline + -22 -12 -60 -24 -7 42 -2 8 1 9 4 10 11 24 19 22 20 18 29 26 39 30 44 9 52 11 23 -15 -12 -52 rrcurveto + -2 -6 0 -4 -2 vvcurveto + 1 -5 6 5 2 3 11 12 9 16 3 20 10 63 -57 12 -51 -15 rrcurveto + 32 -200 rmoveto + 7 22 4 18 14 vvcurveto + 23 -8 18 -20 -5 -5 -2 -2 -5 vhcurveto + -22 -9 -32 -33 -29 vvcurveto + -28 28 -15 19 -11 vhcurveto + -6 -6 -8 -7 -10 -7 -41 -29 -51 -32 -42 -27 rrcurveto + -7 -4 -2 -2 -1 vvcurveto + 6 1 81 20 55 27 43 58 rlinecurve + 7 -5 6 -1 5 -7 rrcurveto + 8 12 7 11 14 vvcurveto + 1 vlineto + -1 9 -5 5 -6 4 rrcurveto + -37 54 rmoveto + 3 hlineto + 12 5 -11 -14 -6 0 -6 -2 -8 hvcurveto + -10 5 -27 10 14 vvcurveto + 9 11 6 8 1 vhcurveto + endchar + + + 3 207 705 rmoveto + 8 -125 29 46 -8 125 rlineto + 82 -159 rmoveto + 13 18 18 15 -16 20 -13 16 -30 -9 -12 -11 -25 -24 -23 -25 -23 -26 -34 -6 -38 -3 -40 1 rrcurveto + -2 -2 -4 -1 2 hvcurveto + 29 -17 15 -15 25 -2 11 -1 13 1 17 4 51 13 38 21 26 35 rrcurveto + -19 9 rmoveto + 2 -3 2 -6 -4 -2 -22 -11 -27 -5 -27 -5 14 14 13 15 18 10 11 6 15 -4 5 -9 rrcurveto + -57 -290 rmoveto + 14 -40 18 -55 -1 -26 -50 -22 -89 -24 -60 -11 -74 -133 rcurveline + 56 15 105 22 46 24 29 15 25 22 21 24 rrcurveto + 122 145 -85 158 0 vvcurveto + endchar + + + -213 69 575 rmoveto + -54 43 -43 54 54 43 43 54 54 -43 43 -54 -54 -43 -43 -54 vhcurveto + 30 hmoveto + 37 30 30 37 37 30 -30 -37 -37 -30 -30 -37 -37 -30 30 37 vhcurveto + endchar + + + -122 349 687 rmoveto + 4 -29 -24 3 -27 hhcurveto + -73 -63 -21 -71 -35 hvcurveto + -6 -12 -5 -12 -13 vvcurveto + -38 54 -50 38 -35 vhcurveto + -77 -77 -81 -102 -103 vvcurveto + -82 44 -87 104 131 103 131 129 55 -30 50 -38 39 vhcurveto + -95 91 rlineto + -80 76 -25 16 27 vvcurveto + 32 32 9 33 66 38 -7 -2 35 vhcurveto + 15 42 rlineto + -151 -257 rmoveto + 60 -60 76 -81 -72 vvcurveto + -83 -45 -82 -75 -85 -36 96 72 76 35 62 70 72 vhcurveto + endchar + + + -25 420 595 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + endchar + + + -545 160 595 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + endchar + + + 279 471 514 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 273 -238 rmoveto + -657 hlineto + -7 -40 rlineto + 658 hlineto + -267 -238 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + endchar + + + -69 439 593 rmoveto + 79 -42 -57 12 -69 -1 -1 0 -1 hhcurveto + 114 vlineto + -40 -8 rlineto + -110 vlineto + -86 -14 -73 -60 -102 vvcurveto + -89 54 -47 105 -46 vhcurveto + -275 vlineto + -2 -2 0 -2 hhcurveto + -67 -39 49 66 -20 hvcurveto + -16 1 -55 -63 rlineto + -69 27 64 -28 66 hhcurveto + 15 16 1 3 15 hvcurveto + -114 vlineto + 40 8 rlineto + 116 vlineto + 93 29 81 74 96 vvcurveto + 76 -52 51 -100 44 vhcurveto + -7 3 -8 4 -7 3 rrcurveto + 251 vlineto + 54 -7 29 -41 15 -57 13 -3 rcurveline + -234 -3 rmoveto + 54 34 45 49 11 vhcurveto + -229 vlineto + -47 29 -36 37 53 vvcurveto + 213 -351 rmoveto + -63 -38 -49 -52 -19 vhcurveto + 247 vlineto + 48 -27 42 -44 -45 vvcurveto + endchar + + + 79 13 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + endchar + + + 79 13 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + endchar + + + -222 192 392 rmoveto + 44 -17 35 -45 -39 -56 -39 -36 -45 vhcurveto + 13 -18 rlineto + 15 24 34 17 22 hhcurveto + 26 9 -33 -52 hvcurveto + -6 -221 rlineto + -99 37 -13 43 55 52 52 45 34 vhcurveto + 11 vlineto + -13 10 rlineto + -24 -27 -27 -21 -38 hhcurveto + -35 -9 43 74 hvcurveto + endchar + + + -257 18 375 rmoveto + 13 25 35 20 16 hhcurveto + 36 8 -12 -242 -44 -3 -124 -17 -62 hvcurveto + -14 -50 -40 -45 -74 -44 16 -16 rcurveline + 90 43 76 60 30 87 rrcurveto + 12 35 0 140 20 vvcurveto + 37 0 167 -7 43 vhcurveto + 33 -3 -10 34 -48 hhcurveto + -43 -57 -43 -32 -41 hvcurveto + endchar + + + 3 380 636 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + -138 -325 rmoveto + 14 -40 18 -55 -1 -26 -50 -22 -89 -24 -60 -11 -74 -133 rcurveline + 56 15 105 22 46 24 29 15 25 22 21 24 rrcurveto + 122 145 -85 158 0 vvcurveto + endchar + + + -83 438 340 rmoveto + 77 -56 61 -86 -76 -72 -33 -57 -49 vhcurveto + -39 -45 -12 -59 -58 vvcurveto + -113 32 -125 134 86 80 58 58 62 vhcurveto + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + 282 122 rlineto + 11 5 10 4 12 vvcurveto + -177 98 rmoveto + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + 26 21 30 16 33 hhcurveto + endchar + + + -107 354 714 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 246 -220 rmoveto + 77 -56 61 -86 -76 -72 -33 -57 -49 vhcurveto + -39 -45 -12 -59 -58 vvcurveto + -113 32 -125 134 86 80 58 58 62 vhcurveto + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + 282 122 rlineto + 11 5 10 4 12 vvcurveto + -177 98 rmoveto + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + 26 21 30 16 33 hhcurveto + endchar + + + -107 76 561 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + 193 -402 rmoveto + 77 -56 61 -86 -76 -72 -33 -57 -49 vhcurveto + -39 -45 -12 -59 -58 vvcurveto + -113 32 -125 134 86 80 58 58 62 vhcurveto + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + 282 122 rlineto + 11 5 10 4 12 vvcurveto + -177 98 rmoveto + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + 26 21 30 16 33 hhcurveto + endchar + + + -107 399 615 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 241 -275 rmoveto + 77 -56 61 -86 -76 -72 -33 -57 -49 vhcurveto + -39 -45 -12 -59 -58 vvcurveto + -113 32 -125 134 86 80 58 58 62 vhcurveto + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + 282 122 rlineto + 11 5 10 4 12 vvcurveto + -177 98 rmoveto + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + 26 21 30 16 33 hhcurveto + endchar + + + -107 109 716 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 282 -412 rmoveto + 77 -56 61 -86 -76 -72 -33 -57 -49 vhcurveto + -39 -45 -12 -59 -58 vvcurveto + -113 32 -125 134 86 80 58 58 62 vhcurveto + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + 282 122 rlineto + 11 5 10 4 12 vvcurveto + -177 98 rmoveto + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + 26 21 30 16 33 hhcurveto + endchar + + + -45 312 396 rmoveto + 60 37 63 63 72 vvcurveto + 82 -70 56 -102 vhcurveto + -9 hlineto + -81 -32 -84 -46 -98 vvcurveto + -71 57 -58 55 -38 vhcurveto + -11 vlineto + -108 -63 -53 -39 -93 vvcurveto + -45 10 -45 32 -32 vhcurveto + -35 35 54 -10 48 hhcurveto + 119 123 78 129 80 -43 36 -106 72 hvcurveto + -33 27 rmoveto + -53 37 -60 54 59 vvcurveto + 39 11 28 46 30 vhcurveto + 85 43 -66 -50 -53 -30 -49 -42 -29 hvcurveto + -41 -78 rmoveto + 82 -52 54 -39 -75 vvcurveto + -79 -46 -57 -83 -79 -43 75 70 77 46 44 69 36 vhcurveto + endchar + + + 12 351 139 rmoveto + -65 138 -63 135 -30 169 -2 8 -11 -9 -3 -5 -15 -27 -2 -38 -8 -32 -32 -123 -34 -117 -50 -103 rrcurveto + -48 -5 -45 -7 -41 vhcurveto + 3 -1 2 0 1 3 50 114 47 120 36 134 36 -117 52 -133 58 -121 15 47 15 48 12 44 rrcurveto + endchar + + + -99 247 97 rmoveto + -46 97 -44 94 -21 119 -1 5 -8 -6 -2 -3 -11 -19 -1 -27 -6 -22 -22 -87 -24 -81 -35 -72 rrcurveto + -34 -3 -32 -5 -28 vhcurveto + 2 -1 1 0 1 2 35 80 33 84 25 94 25 -82 37 -93 40 -85 11 33 10 34 9 30 rrcurveto + endchar + + + -99 247 366 rmoveto + -46 97 -44 94 -21 119 -1 5 -8 -6 -2 -3 -11 -19 -1 -27 -6 -22 -22 -86 -24 -82 -35 -72 rrcurveto + -34 -3 -32 -5 -28 vhcurveto + 2 -1 1 0 1 2 35 80 33 84 25 94 25 -82 37 -93 40 -85 11 33 10 34 9 30 rrcurveto + endchar + + + 230 231 rmoveto + 7 vlineto + 40 22 44 38 43 vvcurveto + 50 -49 33 -68 vhcurveto + -6 hlineto + -54 -19 -58 -27 -60 vvcurveto + -43 38 -34 38 -23 vhcurveto + -7 vlineto + -72 -37 -37 -24 -56 vvcurveto + -27 6 -27 22 -19 vhcurveto + -21 23 38 -6 32 hhcurveto + 81 83 47 77 49 -30 20 -71 44 hvcurveto + -22 16 rmoveto + -36 22 -41 33 35 vvcurveto + 23 8 17 31 18 vhcurveto + 58 29 -39 -30 -32 -20 -30 -29 -17 hvcurveto + -28 -47 rmoveto + 55 -31 37 -24 -44 vvcurveto + -49 -33 -33 -54 -53 -30 44 43 47 32 25 46 22 vhcurveto + endchar + + + 230 506 rmoveto + 7 vlineto + 40 22 44 38 43 vvcurveto + 50 -49 33 -68 vhcurveto + -6 hlineto + -54 -19 -58 -27 -60 vvcurveto + -43 38 -34 38 -23 vhcurveto + -7 vlineto + -72 -37 -37 -24 -56 vvcurveto + -27 6 -27 22 -19 vhcurveto + -21 23 38 -6 32 hhcurveto + 81 83 47 77 49 -30 20 -71 44 hvcurveto + -22 16 rmoveto + -36 22 -41 33 35 vvcurveto + 23 8 17 31 18 vhcurveto + 58 29 -39 -30 -32 -20 -30 -29 -17 hvcurveto + -28 -47 rmoveto + 55 -31 37 -24 -44 vvcurveto + -49 -33 -33 -54 -53 -30 44 43 47 32 25 46 22 vhcurveto + endchar + + + 636 71 82 rmoveto + -5 -5 -3 -6 -5 vvcurveto + -4 2 -4 3 -4 vhcurveto + 43 -50 rlineto + -5 4 5 -1 5 hhcurveto + 3 4 2 7 7 hvcurveto + 39 43 rlineto + 5 5 2 5 5 vvcurveto + 4 -2 6 -4 5 vhcurveto + -39 42 rlineto + 5 -6 -5 2 -4 hhcurveto + -5 -4 -1 -5 -5 hvcurveto + 293 -41 rmoveto + -5 -5 -3 -6 -5 vvcurveto + -4 2 -4 3 -4 vhcurveto + 43 -50 rlineto + -5 4 5 -1 5 hhcurveto + 3 5 2 7 7 hvcurveto + 39 43 rlineto + 5 5 2 5 5 vvcurveto + 4 -2 6 -4 5 vhcurveto + -39 42 rlineto + 5 -6 -6 2 -4 hhcurveto + -5 -4 -1 -5 -5 hvcurveto + 294 -41 rmoveto + -5 -5 -3 -6 -5 vvcurveto + -4 2 -4 3 -4 vhcurveto + 43 -50 rlineto + -5 4 5 -1 5 hhcurveto + 3 4 2 7 7 hvcurveto + 39 43 rlineto + 5 5 2 5 5 vvcurveto + 4 -2 6 -4 5 vhcurveto + -39 42 rlineto + 5 -6 -5 2 -4 hhcurveto + -5 -4 -1 -5 -5 hvcurveto + endchar + + + 636 205 vmoveto + 1000 58 -1000 hlineto + endchar + + + 177 27 205 rmoveto + 487 58 -487 hlineto + endchar + + + -175 335 430 rmoveto + 22 -31 -35 19 -39 hhcurveto + -85 -82 -55 -96 -30 20 -34 23 -14 hvcurveto + -7 vlineto + -54 -25 -31 -44 -57 vvcurveto + -79 74 -45 74 79 72 40 57 53 vhcurveto + -8 14 -9 2 rlineto + -32 -39 -48 -28 -46 hhcurveto + -64 -68 40 73 54 48 27 45 16 15 -1 -4 15 hvcurveto + 21 47 rlineto + -81 5 -58 -13 87 vvcurveto + 49 46 28 40 40 41 -21 -43 15 vhcurveto + 11 -1 rlineto + endchar + + + -125 213 258 rmoveto + -2 -1 -64 1 -37 hhcurveto + -6 6 rlineto + 78 2 35 87 96 hhcurveto + 53 26 -12 -59 42 hvcurveto + 13 2 37 53 rlineto + 37 -37 -49 22 -52 hhcurveto + -144 -105 -128 -140 -60 16 -62 43 -43 hvcurveto + -37 37 56 -12 51 hhcurveto + 72 71 42 44 56 hvcurveto + -12 20 -8 1 rlineto + -33 -39 -51 -16 -51 hhcurveto + -36 -45 5 24 -24 hvcurveto + -35 35 -18 48 -2 49 5 6 rcurveline + 1 26 42 2 1 hhcurveto + 47 64 0 -1 30 hvcurveto + 14 42 rlineto + endchar + + + 278 745 369 rmoveto + -661 hlineto + -7 -40 rlineto + 662 hlineto + 6 -157 rmoveto + -661 hlineto + -7 -40 rlineto + 662 hlineto + endchar + + + -5 498 -164 rmoveto + -15 122 -2 123 123 vvcurveto + 177 11 85 -104 -64 -71 -38 -37 -56 vhcurveto + -11 2 rlineto + 49 -3 -25 21 -41 hhcurveto + -45 -49 -41 -29 -36 hvcurveto + 16 -18 rlineto + 14 22 28 19 19 hhcurveto + 37 2 -42 -32 hvcurveto + -335 vlineto + 9 -10 72 25 rlineto + -3 57 -4 67 46 vvcurveto + 53 0 83 2 24 vhcurveto + 29 41 48 29 47 hhcurveto + 105 -20 -107 -170 -105 0 -181 -1 -27 hvcurveto + 9 -11 rlineto + endchar + + + -84 144 662 rmoveto + 27 -16 23 -17 20 -22 -108 -57 rcurveline + 13 -39 122 65 22 -31 20 -36 18 -43 rlinecurve + -3 -5 -37 4 -23 -1 -21 -3 rlinecurve + -151 -24 -54 -135 20 -127 7 -46 25 -69 40 -35 41 -36 54 0 57 9 41 7 38 23 28 33 70 81 -2 114 -16 100 -15 96 -51 86 -62 62 92 49 rcurveline + -13 39 -112 -59 -31 25 -32 19 -33 11 rlinecurve + 187 -539 rmoveto + -8 -47 -23 -51 -52 -8 -98 -15 -41 119 -8 47 -14 90 16 133 116 18 27 4 28 -4 26 -7 14 -37 10 -39 6 -40 8 -53 3 -57 -10 -53 rrcurveto + endchar + + + 93 425 270 rmoveto + 10 40 rlineto + -225 hlineto + -1 11 -1 12 11 vvcurveto + 9 0 9 1 8 vhcurveto + 242 hlineto + 10 40 rlineto + -249 hlineto + 34 246 224 39 63 -166 14 -1 rcurveline + 57 58 -125 142 -168 -22 -101 -116 rlinecurve + -46 -53 -26 -61 -12 -66 rrcurveto + -65 hlineto + -10 -40 rlineto + 70 hlineto + -1 -15 -1 -14 -15 -5 0 -6 -5 vvcurveto + -84 hlineto + -10 -40 rlineto + 97 hlineto + 9 -79 27 -75 57 -57 rrcurveto + -45 45 53 -18 52 hhcurveto + 85 -1 81 43 41 38 -17 29 rcurveline + -71 -37 -104 -23 -77 64 -42 35 -31 60 -14 66 rrcurveto + endchar + + + -111 132 194 rmoveto + 13 10 6 18 8 16 29 58 22 70 -7 98 -11 153 -56 100 -50 107 -20 -48 -22 -45 -18 -47 -3 -7 21 -30 4 -8 56 -108 50 -149 -30 -180 rrcurveto + -2 -1 -13 9 7 vhcurveto + -83 -109 rmoveto + -3 -4 0 -5 4 -3 72 -70 rcurveline + 4 -3 6 -1 3 4 88 92 rcurveline + 3 4 1 5 -4 3 -73 70 rcurveline + -4 3 -5 1 -3 -4 rrcurveto + endchar + + + -329 112 186 rmoveto + 36 371 rlineto + 3 29 2 29 29 vvcurveto + 20 -7 26 -30 -32 -18 -14 -51 vhcurveto + -1 -17 3 -22 1 -19 27 -383 rcurveline + -42 -138 rmoveto + -31 26 -26 32 31 25 26 31 31 -25 26 -31 -32 -26 -26 -31 vhcurveto + endchar + + + -329 54 442 rmoveto + -31 26 -26 32 31 25 26 31 31 -25 26 -31 -32 -26 -26 -31 vhcurveto + 58 -140 rmoveto + -16 2 -27 -383 -1 -19 -3 -22 1 -17 rlinecurve + -51 18 -14 32 30 7 26 20 29 -2 29 -3 29 vhcurveto + endchar + + + -216 3 428 rmoveto + -4 -22 5 -7 rlineto + 112 hlineto + 6 -8 rlineto + -108 vlineto + -91 -6 -94 -7 -99 vhcurveto + 17 -11 79 24 rlineto + -7 81 -3 95 94 vvcurveto + 111 vlineto + 6 6 rlineto + 115 hlineto + 7 6 7 22 -5 7 rlineto + -124 hlineto + -4 6 rlineto + 102 17 87 43 47 7 -43 -21 4 vhcurveto + 12 -4 58 54 rlineto + 27 -13 -26 27 -54 hhcurveto + -63 -60 -37 -70 -30 hvcurveto + -16 -36 -2 -51 -35 vvcurveto + -6 -6 rlineto + -105 hlineto + endchar + + + -228 314 641 rmoveto + 28 -22 vlineto + -63 -60 -37 -70 -30 hvcurveto + -16 -36 -2 -51 -35 vvcurveto + -6 -6 rlineto + -105 hlineto + -7 -6 -4 -22 5 -7 rlineto + 112 hlineto + 6 -8 rlineto + -108 vlineto + -91 -6 -94 -7 -99 vhcurveto + 17 -11 79 24 rlineto + -7 81 -3 95 94 vvcurveto + 111 vlineto + 6 6 rlineto + 115 hlineto + 7 6 7 22 -5 7 rlineto + -124 hlineto + -4 6 rlineto + 66 6 64 22 37 vhcurveto + 12 20 16 9 22 2 43 4 -10 -2 6 1 rrcurveto + endchar + + + 79 7 rmoveto + 29 46 -67 -24 -76 -26 -64 -26 rlinecurve + -33 -52 61 30 81 28 69 24 rlinecurve + endchar + + + 79 75 rmoveto + 29 46 -67 -24 -76 -26 -64 -26 rlinecurve + -33 -52 61 30 81 28 69 24 rlinecurve + -65 vmoveto + 29 46 -67 -24 -76 -26 -64 -26 rlinecurve + -33 -52 61 30 81 28 69 24 rlinecurve + endchar + + + 315 562 663 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -474 -629 rmoveto + 111 -74 277 53 103 122 67 79 40 106 -45 89 -25 49 -46 42 -33 -45 -27 -37 -19 -45 -22 -41 -10 -19 -1 -34 19 -9 32 -16 38 15 21 18 rrcurveto + 11 12 21 -75 0 vvcurveto + -72 -72 -455 -111 17 200 4 53 24 42 20 36 -11 -3 -4 -9 -5 -8 -114 -174 15 -98 69 -46 rrcurveto + endchar + + + 315 88 34 rmoveto + 111 -74 277 53 103 122 67 79 40 106 -45 89 -25 49 -46 42 -33 -45 -27 -37 -19 -45 -22 -41 -10 -19 -1 -34 19 -9 32 -16 38 15 21 18 rrcurveto + 11 12 21 -75 0 vvcurveto + -72 -72 -455 -111 17 200 4 53 24 42 20 36 -11 -3 -4 -9 -5 -8 -114 -174 15 -98 69 -46 rrcurveto + endchar + + + 203 103 386 rmoveto + -5 -4 -3 -6 -4 hvcurveto + -24 -38 -24 -44 -23 -51 rrcurveto + -13 -30 -7 -29 -27 vvcurveto + -19 3 -18 7 -18 vhcurveto + 11 -33 21 -24 31 -17 rrcurveto + -20 35 41 -9 52 hhcurveto + 114 112 33 38 77 hvcurveto + 16 4 57 16 46 30 35 44 rlinecurve + 35 44 28 49 20 54 rrcurveto + 5 20 3 17 15 vvcurveto + 39 -21 32 -39 -24 -26 -16 -32 -27 vhcurveto + -47 -55 -42 -68 -37 -82 -37 -13 -48 -13 -60 -12 rrcurveto + -8 -38 -36 -5 -34 hhcurveto + -19 -17 1 3 -17 hvcurveto + -49 7 -34 20 -20 34 rrcurveto + -6 11 -3 13 15 vvcurveto + 33 14 44 29 54 vhcurveto + 2 5 1 3 3 vvcurveto + 6 -3 3 -7 vhcurveto + 444 -152 rmoveto + 6 2 5 4 5 vhcurveto + 18 24 15 27 31 11 rrcurveto + 14 -6 24 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -26 -12 -24 -7 -21 -1 rrcurveto + -9 4 -13 14 14 vvcurveto + endchar + + + 439 287 3 rmoveto + 87 -11 111 10 86 13 94 14 108 27 62 40 69 45 49 76 30 83 16 61 -8 38 -32 17 -32 17 -35 -14 -37 -44 -47 -55 -42 -70 -38 -83 -76 -27 -96 -8 -93 -7 rrcurveto + -158 -2 -120 35 -84 73 -32 27 -15 24 2 20 2 20 10 18 18 18 61 58 76 42 90 28 90 28 86 15 82 3 53 112 rcurveline + -78 -3 -72 -9 -65 -17 -143 -37 -115 -57 -79 -103 -78 -101 -27 -123 92 -100 43 -47 76 -30 109 -14 rrcurveto + 574 297 rmoveto + 13 -5 11 -14 9 -24 9 -24 -3 -16 -16 -7 -26 -12 -24 -7 -21 -1 -13 7 -18 21 15 20 18 24 14 28 32 10 rrcurveto + endchar + + + 26 208 255 rmoveto + 25 22 13 11 13 hvcurveto + 1 1 1 1 1 hhcurveto + 5 6 -9 -20 7 hvcurveto + 12 -36 -32 -25 -93 -29 -154 -33 rlinecurve + -22 -129 100 21 65 19 33 17 rlinecurve + 33 17 30 25 27 31 29 33 22 43 13 54 rrcurveto + 5 21 3 20 19 vvcurveto + 62 -31 50 -37 27 vhcurveto + 6 -8 -7 3 -7 hhcurveto + -11 -11 -7 -14 -10 hvcurveto + -27 -36 -19 -46 -22 -41 rrcurveto + -5 -9 -2 -11 -12 vvcurveto + -27 20 -10 25 vhcurveto + endchar + + + 189 456 215 rmoveto + -12 -11 -27 -14 -42 -16 -70 -27 -102 -28 -92 8 -40 4 -24 16 -8 29 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 65 -7 70 8 74 21 74 21 60 35 44 49 rrcurveto + 47 53 53 125 -47 93 -13 24 -16 20 -20 14 -20 14 -17 -4 -17 -22 -27 -37 -19 -45 -22 -41 -10 -18 -1 -35 19 -9 33 -17 38 18 19 16 5 6 8 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + endchar + + + 65 328 118 rmoveto + 58 64 34 124 -41 81 -25 49 -45 41 -33 -45 -27 -37 -19 -45 -22 -41 -10 -19 -1 -34 19 -9 32 -16 37 15 21 18 10 12 21 -68 2 -7 -30 -15 -157 -69 -67 17 rrcurveto + -24 6 -13 30 2 29 rrcurveto + 4 -4 2 -4 -6 vhcurveto + -40 -58 -29 -101 65 -32 68 -33 175 91 47 52 rrcurveto + endchar + + + 257 509 141 rmoveto + 29 32 22 43 13 55 21 90 -30 73 -51 37 -20 14 -18 -4 -17 -22 -27 -36 -18 -47 -22 -41 -11 -18 -1 -35 19 -9 33 -16 39 18 19 16 6 6 6 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + -16 -14 -31 -16 -49 -18 -82 -31 -117 -31 -106 8 -46 3 -27 17 -8 30 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 68 -7 80 8 93 23 93 23 70 38 49 54 rrcurveto + endchar + + + -152 138 87 rmoveto + -22 -18 -47 -17 -29 -10 -7 -17 rcurveline + 98 -25 18 25 24 42 11 32 rlinecurve + 12 30 6 31 33 vvcurveto + 9 vlineto + -1 36 -9 33 -14 29 -13 24 -16 20 -20 14 rrcurveto + 6 -8 -7 2 -7 hhcurveto + -11 -11 -6 -14 -10 hvcurveto + -27 -36 -19 -47 -22 -41 rrcurveto + -5 -9 -2 -10 -13 vvcurveto + -2 vlineto + -25 1 19 -10 24 hhcurveto + 25 23 14 11 13 hvcurveto + 1 1 1 0 1 hhcurveto + 6 5 -13 -24 7 hvcurveto + 8 -29 4 -17 1 -4 rrcurveto + -1 -2 0 -1 -2 vvcurveto + endchar + + + 235 193 26 rmoveto + 52 62 52 41 52 19 52 19 46 29 38 39 52 54 50 117 -47 96 -13 24 -16 21 -20 14 -20 14 -17 -5 -17 -22 -27 -37 -19 -45 -22 -41 -10 -19 -1 -34 19 -9 rrcurveto + 33 -17 38 18 19 16 5 6 8 -9 8 -24 rrcurveto + 12 -36 0 -1 0 vvcurveto + -5 -4 -20 -10 -36 -14 rrcurveto + -14 -36 -19 -8 -2 hhcurveto + -98 -29 -68 -50 -40 -74 -40 -74 -41 -78 -41 -82 4 30 rcurveline + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 rrcurveto + endchar + + + 51 316 200 rmoveto + 26 29 21 43 13 57 13 57 -2 48 -19 38 -13 24 -16 20 -20 14 -20 14 -18 -4 -16 -22 -27 -36 -19 -46 -22 -41 -10 -19 -1 -35 19 -9 33 -16 38 18 19 16 rrcurveto + 5 6 7 -10 8 -24 rrcurveto + 12 -36 1 0 0 vvcurveto + -11 -9 -60 -14 -15 -6 -62 -14 -48 -18 -34 -35 -48 -50 -18 -69 -32 -69 21 -2 rcurveline + 31 77 57 30 84 22 50 13 45 23 28 35 rrcurveto + endchar + + + 314 249 224 rmoveto + -11 -9 -17 -9 -23 -9 rrcurveto + -1 vlineto + -30 -14 -35 -13 -26 -18 rrcurveto + 0 -2 -1 -6 -5 vhcurveto + -39 -29 -42 -33 -18 -50 45 -33 rcurveline + 1 5 5 0 vhcurveto + 30 21 37 22 32 20 rrcurveto + 1 vlineto + 4 3 3 1 2 1 33 17 35 31 21 23 21 30 17 30 10 30 27 71 -2 68 -31 63 -13 24 -16 20 -20 14 -20 14 -17 -5 -17 -22 -27 -37 -19 -45 -22 -41 rrcurveto + -10 -18 -2 -35 19 -9 33 -17 39 17 19 17 15 13 18 -94 1 -5 rrcurveto + -1 -2 0 -1 -2 vvcurveto + endchar + + + 18 285 149 rmoveto + 26 29 20 44 13 57 13 57 -2 47 -19 38 -13 24 -16 20 -20 14 -20 14 -18 -4 -17 -22 -27 -36 -18 -46 -22 -41 -10 -18 -1 -35 18 -9 33 -17 39 18 19 16 rrcurveto + 11 13 20 -74 1 -2 -16 -11 -24 -5 -22 -4 -60 -15 -44 -12 -28 -10 -28 -10 -21 -17 -14 -23 -9 -16 -8 -23 -7 -31 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 11 17 rrcurveto + 1 hlineto + 16 15 19 13 25 12 66 29 79 12 45 51 rrcurveto + endchar + + + 356 522 280 rmoveto + 25 23 14 11 13 hvcurveto + 1 1 1 1 1 hhcurveto + 5 6 -10 -20 7 hvcurveto + 12 -36 -43 -38 -102 -26 -74 -16 rlinecurve + -15 -68 -78 -15 -73 hhcurveto + -50 -34 13 32 -17 hvcurveto + -4 8 -3 10 12 vvcurveto + 29 14 40 26 52 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -55 21 -25 57 -8 vhcurveto + -3 19 20 -1 23 hhcurveto + 21 22 2 2 24 hvcurveto + 106 10 103 30 81 39 91 44 52 56 26 104 rrcurveto + 5 21 2 19 19 vvcurveto + 29 -6 27 -12 25 vhcurveto + -13 24 -16 20 -20 14 rrcurveto + 6 -8 -8 3 -7 hhcurveto + -11 -11 -7 -14 -10 hvcurveto + -27 -37 -18 -45 -22 -41 rrcurveto + -5 -9 -2 -11 -12 vvcurveto + -27 19 -11 25 vhcurveto + endchar + + + -152 138 87 rmoveto + -22 -18 -47 -17 -29 -10 -7 -17 rcurveline + 98 -25 18 25 24 42 11 32 rlinecurve + 12 30 6 31 33 vvcurveto + 9 vlineto + -1 36 -9 33 -14 29 -13 24 -16 20 -20 14 rrcurveto + 6 -8 -7 2 -7 hhcurveto + -11 -11 -6 -14 -10 hvcurveto + -27 -36 -19 -47 -22 -41 rrcurveto + -5 -9 -2 -10 -13 vvcurveto + -2 vlineto + -25 1 19 -10 24 hhcurveto + 25 23 14 11 13 hvcurveto + 1 1 1 0 1 hhcurveto + 6 5 -13 -24 7 hvcurveto + 8 -29 4 -17 1 -4 rrcurveto + -1 -2 0 -1 -2 vvcurveto + endchar + + + 671 416 1 rmoveto + 110 4 107 20 90 30 114 38 72 51 42 112 23 62 -1 56 -25 51 -13 24 -16 20 -20 14 -20 14 -17 -4 -17 -22 -27 -36 -19 -46 -22 -41 -11 -18 0 -35 19 -9 rrcurveto + 33 -16 38 17 19 16 6 6 7 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + -17 -15 -35 -17 -54 -19 -54 -19 -36 -10 -17 -4 -72 -16 -80 -8 -80 -6 -158 -2 -120 36 -84 73 -32 27 -15 24 2 20 2 20 11 19 18 17 61 58 75 42 90 28 rrcurveto + 90 28 86 15 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -38 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 61 -66 140 -34 156 5 rrcurveto + endchar + + + -81 404 415 rmoveto + -24 -26 -16 -32 -27 hvcurveto + -51 -60 -43 -74 -34 -77 -180 -27 rcurveline + -19 -129 97 21 137 34 57 16 47 31 35 44 rlinecurve + 35 44 27 49 20 53 rrcurveto + 5 20 3 18 15 vvcurveto + 39 -20 31 -39 vhcurveto + -142 -201 rmoveto + 6 2 5 4 5 vhcurveto + 18 24 15 29 32 10 rrcurveto + 13 -6 25 -31 -29 vvcurveto + -11 -6 -8 -10 -5 vhcurveto + -26 -12 -23 -7 -21 -2 rrcurveto + -9 4 -14 14 14 vvcurveto + endchar + + + 11 56 1 rmoveto + 81 -8 146 42 60 22 52 18 42 30 33 43 33 43 26 46 19 51 16 61 -9 38 -32 17 -32 17 -35 -14 -37 -44 -47 -55 -42 -69 -38 -83 -43 -16 -69 -17 -57 6 rrcurveto + -49 4 -28 16 -7 26 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 rrcurveto + 370 288 rmoveto + 13 -5 10 -14 9 -24 9 -24 -3 -16 -16 -7 -26 -12 -23 -7 -21 -2 -13 7 -19 22 15 20 18 24 15 28 32 10 rrcurveto + endchar + + + -75 241 38 rmoveto + 113 32 68 98 39 107 31 121 -84 42 -75 -88 -51 -60 -42 -70 -35 -78 -40 -7 -40 -13 -41 10 -25 6 -14 32 4 30 rrcurveto + 4 -2 2 -4 -6 vhcurveto + -41 -57 -30 -105 66 -32 45 -22 117 44 41 10 rrcurveto + 98 238 rmoveto + 26 -10 29 -66 -32 -15 -22 -11 -25 -7 -24 -2 -15 8 -15 22 13 18 18 24 15 28 32 11 rrcurveto + endchar + + + 127 213 11 rmoveto + 36 6 52 10 67 16 67 16 49 17 31 21 69 45 49 76 30 83 16 61 -8 38 -32 17 -32 17 -35 -14 -37 -44 -48 -55 -42 -70 -37 -83 -59 -21 -65 -8 -72 -7 rrcurveto + -71 -7 -87 0 -15 51 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 45 -4 52 3 60 10 rrcurveto + 328 291 rmoveto + 13 -5 10 -15 9 -24 9 -24 -3 -16 -16 -7 -26 -12 -23 -6 -21 -2 -13 7 -18 21 15 20 18 24 15 29 31 10 rrcurveto + endchar + + + -45 271 159 rmoveto + 57 16 46 30 35 44 35 44 27 49 20 54 16 61 -8 38 -32 17 -32 17 -35 -14 -37 -44 -49 -57 -43 -69 -36 -82 -43 -8 -31 -11 -22 -15 -22 -15 -26 -29 -28 -44 rrcurveto + -35 -53 -21 -46 -7 -37 rrcurveto + -6 9 0 3 3 vhcurveto + 31 49 43 40 55 28 52 27 18 -2 60 15 rrcurveto + 98 238 rmoveto + 13 -5 11 -14 9 -24 9 -24 -3 -16 -16 -7 -25 -12 -24 -8 -22 -1 -14 7 -17 21 15 20 18 24 14 28 32 11 rrcurveto + endchar + + + 147 463 143 rmoveto + 57 16 47 30 35 44 35 44 28 49 19 54 16 61 -9 38 -32 17 -32 17 -35 -14 -37 -44 -48 -55 -42 -70 -37 -83 -59 -11 -47 -15 -36 -19 -73 -39 -46 -56 -38 -76 rrcurveto + -19 -39 -22 -45 -25 -50 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 8 -23 15 29 18 35 32 68 24 55 19 42 37 83 44 50 84 34 41 17 59 17 76 18 rrcurveto + 99 238 rmoveto + 13 -5 10 -15 9 -24 9 -24 -3 -15 -16 -7 -25 -12 -24 -8 -21 -1 -13 7 -19 21 15 20 18 24 15 28 32 11 rrcurveto + endchar + + + -19 297 145 rmoveto + 57 16 46 30 35 44 35 44 27 49 20 54 16 61 -8 38 -32 17 -32 17 -35 -14 -37 -44 -48 -56 -42 -68 -37 -83 -37 -7 -34 -8 -29 -10 -54 -18 -41 -56 -25 -55 rrcurveto + -12 -26 -14 -32 -16 -36 21 -2 rcurveline + 25 55 39 35 54 15 54 15 53 13 51 12 rrcurveto + 98 238 rmoveto + 13 -5 10 -15 9 -24 9 -24 -3 -16 -16 -7 -24 -12 -24 -6 -22 -2 -13 7 -18 21 15 20 18 24 15 28 31 11 rrcurveto + endchar + + + -94 248 115 rmoveto + 18 6 21 12 25 19 60 45 42 70 28 76 16 61 -8 38 -32 17 -32 17 -35 -14 -37 -44 -52 -61 -40 -70 -35 -77 -36 -6 -40 -12 -25 -19 -25 -19 -21 -31 -19 -44 rrcurveto + -4 -11 -8 -10 -4 -10 -3 -10 -1 -6 -1 -2 40 -30 rcurveline + 19 23 23 22 23 17 16 11 13 7 11 5 29 12 48 10 26 8 rrcurveto + 72 229 rmoveto + 13 -5 11 -14 9 -24 9 -24 -3 -16 -16 -7 -25 -12 -25 -8 -21 -1 -13 7 -16 22 13 20 18 24 15 27 31 11 rrcurveto + endchar + + + -50 435 444 rmoveto + -24 -26 -16 -32 -27 hvcurveto + -49 -56 -43 -69 -36 -82 -20 -4 rcurveline + -1 hlineto + -2 -4 -13 0 -4 -1 rrcurveto + -2 -1 hlineto + -86 -9 -24 -5 -45 -74 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 14 14 24 10 33 7 33 7 31 8 29 8 rrcurveto + 1 1 vlineto + 11 3 11 3 11 2 75 17 54 28 43 54 35 44 27 49 20 53 rrcurveto + 5 20 3 18 15 vvcurveto + 39 -20 31 -39 vhcurveto + -141 -200 rmoveto + 6 2 5 4 5 vhcurveto + 18 24 14 27 32 11 rrcurveto + 13 -6 25 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -25 -12 -24 -7 -22 -2 rrcurveto + -9 4 -13 14 15 vvcurveto + endchar + + + 176 677 435 rmoveto + -24 -26 -16 -32 -27 hvcurveto + -48 -56 -43 -69 -37 -82 -30 -8 -42 -11 -56 -14 rrcurveto + -13 -52 -48 -7 -45 hhcurveto + -52 -39 13 30 -23 hvcurveto + -8 10 -4 13 16 vvcurveto + 29 13 38 24 49 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 1 -2 -2 -1 -1 -2 -1 vhcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -39 9 41 -17 58 hhcurveto + 19 23 1 3 27 hvcurveto + 45 5 47 7 49 10 79 16 105 25 56 31 79 43 54 82 32 89 rrcurveto + 5 20 3 18 15 vvcurveto + 39 -20 31 -39 vhcurveto + -141 -201 rmoveto + 6 2 5 4 5 vhcurveto + 18 24 14 28 32 11 rrcurveto + 13 -6 25 -31 -29 vvcurveto + -11 -6 -8 -10 -5 vhcurveto + -24 -12 -24 -7 -22 -2 rrcurveto + -9 4 -13 14 14 vvcurveto + endchar + + + -19 297 145 rmoveto + 57 16 46 30 35 44 35 44 27 49 20 54 16 61 -8 38 -32 17 -32 17 -35 -14 -37 -44 -48 -56 -42 -68 -37 -83 -37 -7 -34 -8 -29 -10 -54 -18 -41 -56 -25 -55 rrcurveto + -12 -26 -14 -32 -16 -36 21 -2 rcurveline + 25 55 39 35 54 15 54 15 53 13 51 12 rrcurveto + 98 238 rmoveto + 13 -5 10 -15 9 -24 9 -24 -3 -16 -16 -7 -24 -12 -24 -6 -22 -2 -13 7 -18 21 15 20 18 24 15 28 31 11 rrcurveto + endchar + + + -45 125 594 rmoveto + 6 6 4 6 48 126 3 2 87 vhcurveto + 27 78 rlineto + -335 hlineto + -7 -7 rlineto + -327 vlineto + 13 -11 rlineto + 31 32 41 22 44 hhcurveto + 103 36 -90 -82 -102 -54 -95 -112 -62 -35 57 49 -22 hvcurveto + -11 hlineto + -44 -56 1 -12 rlineto + -49 41 61 -26 63 hhcurveto + 145 125 109 153 112 -74 80 -117 -46 -45 -17 -20 -41 hvcurveto + endchar + + + -26 223 43 rmoveto + 84 87 17 112 -44 109 -39 95 -68 102 -56 -121 -29 -63 -97 -292 53 -49 47 -44 96 26 36 38 rrcurveto + 32 134 rmoveto + 7 -25 -126 -34 -55 36 -40 26 65 121 28 26 12 11 18 2 14 -10 31 -23 36 -92 10 -38 rrcurveto + endchar + + + -99 172 30 rmoveto + 59 61 12 78 -31 77 -27 66 -48 72 -39 -85 -20 -44 -68 -205 37 -34 33 -31 67 19 25 26 rrcurveto + 23 94 rmoveto + 4 -18 -88 -23 -38 25 -28 18 45 85 20 18 8 8 13 1 10 -7 21 -16 26 -64 7 -27 rrcurveto + endchar + + + -99 172 299 rmoveto + 59 61 12 78 -31 77 -27 66 -48 72 -39 -85 -20 -44 -68 -205 37 -34 33 -31 67 19 25 26 rrcurveto + 23 94 rmoveto + 4 -18 -88 -23 -38 25 -28 18 45 85 20 18 8 8 13 1 10 -7 21 -16 26 -64 7 -27 rrcurveto + endchar + + + 80 401 310 rmoveto + -44 97 -111 80 -81 69 -14 -46 -7 -23 -8 -48 8 -7 2 -2 9 -7 -43 -69 -102 -206 24 -82 47 -163 115 189 67 -50 76 -56 113 175 -51 149 rrcurveto + -25 -133 rmoveto + -11 -16 -26 -21 -20 7 -98 35 13 -59 -81 -10 -149 -19 126 256 42 60 81 -70 86 -59 37 -104 rrcurveto + endchar + + + -99 258 217 rmoveto + -31 68 -78 56 -57 48 -9 -32 -5 -16 -6 -34 6 -5 1 -1 7 -5 -31 -48 -71 -144 17 -58 33 -114 80 132 47 -35 53 -39 79 123 -35 104 rrcurveto + -18 -93 rmoveto + -8 -11 -18 -15 -14 5 -68 24 9 -41 -57 -7 -104 -13 88 179 29 42 57 -49 60 -41 26 -73 rrcurveto + endchar + + + -99 258 486 rmoveto + -31 68 -78 56 -57 48 -9 -32 -5 -16 -6 -34 6 -5 1 -1 7 -5 -31 -48 -71 -144 17 -58 33 -114 80 132 47 -35 53 -39 79 123 -35 104 rrcurveto + -18 -93 rmoveto + -8 -11 -18 -15 -14 5 -68 24 9 -41 -57 -7 -104 -13 88 179 29 42 57 -49 60 -41 26 -73 rrcurveto + endchar + + + 103 356 rmoveto + 4 5 2 4 32 86 2 1 59 vhcurveto + 18 47 rlineto + -227 hlineto + -5 -4 rlineto + -196 vlineto + 8 -7 rlineto + 19 22 28 13 30 hhcurveto + 69 25 -53 -50 -62 -36 -56 -76 -41 -26 34 29 -14 hvcurveto + -8 hlineto + -29 -33 1 -8 rlineto + -29 28 40 -16 43 hhcurveto + 97 86 65 93 67 -50 48 -79 -31 -31 -10 -12 -28 hvcurveto + endchar + + + 103 631 rmoveto + 4 5 2 4 32 86 2 1 59 vhcurveto + 18 47 rlineto + -227 hlineto + -5 -4 rlineto + -196 vlineto + 8 -7 rlineto + 19 22 28 13 30 hhcurveto + 69 25 -53 -50 -62 -36 -56 -76 -41 -26 34 29 -14 hvcurveto + -8 hlineto + -29 -33 1 -8 rlineto + -29 28 40 -16 43 hhcurveto + 97 86 65 93 67 -50 48 -79 -31 -31 -10 -12 -28 hvcurveto + endchar + + + -45 285 669 rmoveto + -286 -434 rlineto + -44 284 vlineto + 7 -9 rlineto + -63 0 -83 -5 -35 vhcurveto + 5 -6 80 33 rlineto + -3 22 0 79 54 vvcurveto + 8 8 rlineto + 82 hlineto + 16 37 -5 7 rlineto + -94 hlineto + -7 9 rlineto + 155 0 272 1 27 vhcurveto + -7 6 rlineto + -77 -469 rmoveto + -215 hlineto + -5 7 1 22 84 138 38 59 rlinecurve + 29 45 30 46 34 39 rrcurveto + 1 1 2 1 2 hhcurveto + 3 2 -3 -5 hvcurveto + -342 vlineto + endchar + + + -6 269 38 rmoveto + 23 36 19 39 22 36 rrcurveto + -5 3 -2 -1 0 vvcurveto + -37 -23 -49 -16 -56 9 -38 7 -39 15 -7 36 58 93 63 62 -109 68 -8 5 -4 10 3 9 11 32 37 11 24 18 15 34 13 35 19 29 -10 -3 -6 -4 -7 -4 rrcurveto + -64 -40 -47 -75 -34 -65 -72 -137 90 46 27 -71 -16 -49 -25 -36 -23 -39 -14 -25 9 -36 18 -16 53 -47 120 9 48 45 rrcurveto + endchar + + + -99 194 27 rmoveto + 16 25 14 27 15 25 rrcurveto + -3 2 -2 0 0 vvcurveto + -26 -16 -34 -12 -39 7 -27 5 -27 10 -5 25 41 65 44 44 -77 47 -5 4 -3 7 2 6 8 23 26 7 17 13 10 24 9 24 13 21 -7 -3 -4 -2 -5 -3 rrcurveto + -44 -28 -33 -53 -24 -45 -51 -96 63 32 19 -50 -11 -34 -17 -25 -16 -27 -10 -18 6 -25 13 -11 37 -33 84 6 33 32 rrcurveto + endchar + + + -99 194 296 rmoveto + 16 25 14 27 15 25 rrcurveto + -3 2 -2 0 0 vvcurveto + -26 -16 -34 -12 -39 7 -27 5 -27 10 -5 25 41 65 44 44 -77 47 -5 4 -3 7 2 6 8 23 26 7 17 13 10 24 9 24 13 21 -7 -3 -4 -2 -5 -3 rrcurveto + -44 -28 -33 -53 -24 -45 -51 -96 63 32 19 -50 -11 -34 -17 -25 -16 -27 -10 -18 6 -25 13 -11 37 -33 84 6 33 32 rrcurveto + endchar + + + 50 219 4 rmoveto + 71 106 -16 135 -64 105 -2 3 10 4 14 -2 107 -18 40 85 11 129 1 8 -10 -17 -1 -4 -7 -34 -103 -76 -42 76 -8 15 28 55 64 -30 39 -18 18 79 -68 -4 rrcurveto + -35 -2 -92 -78 3 -62 -74 14 3 21 -32 62 -19 -38 -15 -41 -15 -39 21 -50 34 -39 27 -42 52 -80 64 -94 -14 -135 rrcurveto + -2 8 4 2 4 vhcurveto + endchar + + + -99 141 3 rmoveto + 50 74 -11 95 -45 73 -1 2 7 3 9 -2 75 -12 28 59 8 91 1 5 -7 -12 -1 -2 -5 -24 -72 -53 -29 53 -6 10 20 39 44 -21 28 -13 12 56 -47 -3 rrcurveto + -25 -2 -64 -54 2 -44 -52 10 2 15 -22 43 -13 -26 -11 -29 -10 -27 14 -35 24 -28 19 -29 36 -56 45 -66 -10 -94 rrcurveto + -2 6 3 1 3 vhcurveto + endchar + + + -99 141 272 rmoveto + 50 74 -11 95 -45 73 -1 2 7 3 9 -1 75 -13 28 59 8 91 1 5 -7 -12 -1 -2 -5 -24 -72 -53 -29 53 -6 10 20 39 44 -21 28 -13 12 56 -47 -3 rrcurveto + -25 -2 -64 -54 2 -44 -52 10 2 15 -22 43 -13 -26 -11 -29 -10 -27 14 -35 24 -28 19 -29 36 -56 45 -66 -10 -94 rrcurveto + -2 6 3 1 3 vhcurveto + endchar + + + 34 263 346 rmoveto + 1 vlineto + 21 30 49 108 41 129 -103 -35 rcurveline + -34 -96 -37 49 -42 59 -30 -3 rlinecurve + -113 -13 -8 -212 52 -89 39 -66 51 -101 -12 -107 6 4 3 5 1 5 17 64 31 63 -9 78 -22 79 -54 84 -29 72 51 71 81 -172 41 -12 3 -1 3 3 3 3 rrcurveto + endchar + + + -99 176 242 rmoveto + 1 vlineto + 15 21 34 76 29 90 -72 -25 rcurveline + -24 -67 -26 34 -29 42 -21 -2 rlinecurve + -79 -9 -6 -149 36 -62 28 -46 35 -71 -8 -75 4 3 2 3 1 4 12 45 22 44 -7 54 -15 56 -38 58 -20 51 35 50 57 -121 29 -8 2 -1 2 2 2 2 rrcurveto + endchar + + + -99 176 511 rmoveto + 1 vlineto + 15 21 34 76 29 90 -72 -25 rcurveline + -24 -67 -26 34 -29 42 -21 -2 rlinecurve + -79 -9 -6 -149 36 -62 28 -46 35 -71 -8 -75 4 3 2 3 1 4 12 45 22 44 -7 54 -15 56 -38 58 -20 51 35 50 57 -121 29 -8 2 -1 2 2 2 2 rrcurveto + endchar + + + 263 422 rmoveto + -51 -21 -194 -260 rlineto + -26 192 vlineto + 5 -6 rlineto + -38 1 -49 -4 -21 vhcurveto + 3 -4 54 20 rlineto + -2 13 1 48 32 vvcurveto + 4 5 rlineto + 56 hlineto + 11 22 -3 4 rlineto + -64 hlineto + -4 5 rlineto + 93 -1 164 1 16 vhcurveto + -53 -273 rmoveto + -4 -5 rlineto + -146 hlineto + -3 4 rlineto + 13 57 84 26 35 vhcurveto + 20 27 20 28 23 23 rrcurveto + 1 1 2 0 1 hhcurveto + 2 1 -1 -4 hvcurveto + endchar + + + 263 697 rmoveto + -51 -21 -194 -260 rlineto + -26 192 vlineto + 5 -6 rlineto + -38 1 -49 -4 -21 vhcurveto + 3 -4 54 20 rlineto + -2 13 1 48 32 vvcurveto + 4 5 rlineto + 56 hlineto + 11 22 -3 4 rlineto + -64 hlineto + -4 5 rlineto + 93 -1 164 1 16 vhcurveto + -53 -273 rmoveto + -4 -5 rlineto + -146 hlineto + -3 4 rlineto + 13 57 84 26 35 vhcurveto + 20 27 20 28 23 23 rrcurveto + 1 1 2 0 1 hhcurveto + 2 1 -1 -4 hvcurveto + endchar + + + -69 263 697 rmoveto + -51 -21 -194 -260 rlineto + -26 192 vlineto + 5 -6 rlineto + -38 1 -49 -4 -21 vhcurveto + 3 -4 54 20 rlineto + -2 13 1 48 32 vvcurveto + 4 5 rlineto + 56 hlineto + 11 22 -3 4 rlineto + -64 hlineto + -4 5 rlineto + 93 -1 164 1 16 vhcurveto + -53 -273 rmoveto + -4 -5 rlineto + -146 hlineto + -3 4 rlineto + 13 57 84 26 35 vhcurveto + 20 27 20 28 23 23 rrcurveto + 1 1 2 0 1 hhcurveto + 2 1 -1 -4 hvcurveto + endchar + + + -475 245 704 rmoveto + -11 -1 -433 -680 rlineto + -14 vlineto + 31 -13 437 688 -3 11 rlineto + endchar + + + -111 62 99 rmoveto + -40 -99 165 20 45 99 rlineto + endchar + + + -34 365 45 rmoveto + -130 -4 -45 -107 -106 hhcurveto + -36 -46 41 36 -18 hvcurveto + -14 hlineto + -49 -62 rlineto + -46 49 45 -10 44 hhcurveto + 61 50 15 39 51 hvcurveto + 20 15 37 34 16 44 rrcurveto + 20 58 2 71 39 vvcurveto + 209 4 72 5 91 vhcurveto + -14 6 -51 -29 rlineto + 25 -33 -43 9 -41 hhcurveto + -128 -101 -103 -178 -116 62 -79 83 63 56 33 30 52 hvcurveto + 9 47 rmoveto + -18 -23 -56 -29 -46 hhcurveto + -50 -64 61 90 90 32 138 118 42 44 -21 -47 3 hvcurveto + endchar + + + 580 562 856 rmoveto + -31 -52 300 172 31 52 rlineto + -375 -880 rmoveto + 40 48 31 79 0 vvcurveto + 8 28 0 14 -3 42 -16 257 rcurveline + 106 62 107 63 106 62 33 117 rcurveline + 1 6 -7 2 -5 -2 -108 -63 -108 -63 -108 -63 -32 -117 rcurveline + -60 -95 rlineto + 7 -100 12 -101 -102 vvcurveto + -182 -92 -155 -29 -72 84 -47 54 30 58 46 83 -11 -3 -11 -8 -5 -8 -75 -115 -15 -81 11 -52 13 -59 43 -44 81 -8 130 -13 145 75 70 84 rrcurveto + endchar + + + -132 -58 rmoveto + -31 -52 300 172 31 52 rlineto + endchar + + + 44 525 465 rmoveto + -37 -95 -82 -160 -65 -120 -8 2 rcurveline + 146 -24 231 -149 -77 -42 -34 -77 -50 vhcurveto + 16 -12 23 27 rlineto + 23 20 40 7 27 hhcurveto + 26 25 -13 -18 19 hvcurveto + 73 -72 31 -261 -39 vvcurveto + -53 -165 17 -14 18 -12 21 -7 rlinecurve + 34 26 rlineto + 5 52 3 55 53 vvcurveto + 23 vlineto + 17 43 75 134 90 124 80 131 rlinecurve + -60 27 rlineto + endchar + + + -92 3 428 rmoveto + -4 -22 5 -7 rlineto + 68 hlineto + 6 -8 rlineto + -108 vlineto + -91 -6 -94 -7 -99 vhcurveto + 17 -11 79 24 rlineto + -7 81 -3 95 94 vvcurveto + 111 vlineto + 6 6 rlineto + 153 hlineto + -76 -133 rlineto + -24 vlineto + 29 -23 48 -43 28 -49 21 -38 4 -39 -15 -44 -23 -67 -77 -58 -85 -17 5 -24 rcurveline + 162 103 100 128 1 hvcurveto + 94 -70 56 -51 41 vhcurveto + 83 146 7 22 -5 7 rlineto + -242 hlineto + -4 6 rlineto + 102 17 87 43 47 7 -43 -21 4 vhcurveto + 12 -4 58 54 rlineto + 27 -13 -26 27 -54 hhcurveto + -63 -60 -37 -70 -30 hvcurveto + -16 -36 -2 -51 -35 vvcurveto + -6 -6 rlineto + -61 hlineto + endchar + + + 319 272 769 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -66 -507 rmoveto + -117 -92 -114 -220 30 -142 55 -261 425 67 163 198 4 4 -12 -3 -5 -1 -175 -46 -260 -38 -136 153 -78 88 247 210 55 48 40 35 65 42 14 36 45 116 rcurveline + -60 -58 -97 -59 -47 46 -32 27 -16 25 -8 49 40 -4 34 -7 31 -10 42 130 rcurveline + -33 8 -29 8 -35 1 -99 2 -58 -206 91 -113 9 -12 10 -11 11 -10 rrcurveto + endchar + + + -25 70 665 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + endchar + + + -545 -130 665 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + endchar + + + 166 574 254 rmoveto + -9 vlineto + -518 -243 -4 -9 8 -24 10 -5 600 280 rlineto + 12 vlineto + -602 275 -10 -3 -10 -24 2 -10 rlineto + endchar + + + -129 374 36 rmoveto + 14 28 -150 170 149 146 -31 46 -192 -188 rlineto + 58 -202 rmoveto + 14 28 -150 170 149 146 -31 46 -192 -188 rlineto + endchar + + + -129 42 36 rmoveto + 210 202 -192 188 -31 -46 149 -146 -150 -170 rlineto + 166 -28 rmoveto + 210 202 -192 188 -31 -46 149 -146 -150 -170 rlineto + endchar + + + -281 12 238 rmoveto + 210 -202 14 28 -150 170 149 146 -31 46 rlineto + endchar + + + -281 252 238 rmoveto + -192 188 -31 -46 149 -146 -150 -170 14 -28 rlineto + endchar + + + 47 499 62 rmoveto + -53 9 83 41 hvcurveto + 74 vlineto + 80 6 70 -30 28 vhcurveto + 18 -19 -31 10 -15 hhcurveto + -73 -69 -40 -36 -59 hvcurveto + -8 8 rlineto + 92 0 99 4 85 vhcurveto + -6 7 -158 -17 -5 -4 rlineto + -18 vlineto + 27 -6 41 -8 9 -12 rrcurveto + 26 -36 -6 -79 -101 vvcurveto + -1 -132 -6 -132 -7 -132 6 -10 rcurveline + 72 22 rlineto + 108 2 110 110 vvcurveto + 28 39 48 32 55 hhcurveto + 74 12 -62 -76 hvcurveto + -36 -4 -87 -54 vvcurveto + -49 19 -50 47 60 53 49 47 44 vhcurveto + 11 vlineto + -13 10 rlineto + -18 -19 -32 -27 -39 hhcurveto + endchar + + + 319 648 -186 rmoveto + 4 4 -12 -3 -5 -1 -175 -46 -260 -39 -136 153 -78 88 247 211 55 48 40 35 43 36 32 46 27 38 64 138 -66 27 -64 27 -108 -20 -44 -31 -66 -47 -39 -153 75 -83 rrcurveto + -90 -82 -118 -209 30 -141 55 -261 426 67 163 198 rrcurveto + -446 594 rmoveto + 29 25 136 24 20 -59 -34 -32 -52 -32 -41 -30 -16 36 -27 30 -15 38 rrcurveto + endchar + + + -176 387 395 rmoveto + -34 -32 -53 -34 -39 -28 -79 -61 rcurveline + -45 -41 -44 -65 -44 -88 -44 -88 -15 -79 15 -71 14 -65 34 -46 53 -26 121 -59 144 26 116 54 67 31 53 40 41 49 2 2 -1 1 -4 -1 -4 -1 -3 0 -3 -1 rrcurveto + -18 -7 -48 -10 -78 -13 -52 -9 -52 -3 -52 2 -117 4 -92 35 -61 69 -20 22 -2 29 16 34 34 73 67 73 59 53 32 29 24 22 14 12 40 35 43 37 32 44 rrcurveto + 13 19 16 35 18 51 18 51 -7 33 -33 14 rrcurveto + 10 -25 -39 4 -53 hhcurveto + -53 -36 -2 -4 -16 hvcurveto + -16 -24 -34 -56 -9 -42 -3 -15 4 -7 12 3 rrcurveto + 4 23 34 2 46 hhcurveto + 46 38 -3 -7 31 hvcurveto + 2 -1 3 -4 3 -9 rrcurveto + endchar + + + 194 21 124 rmoveto + -21 -124 8 1 6 2 8 2 rlinecurve + 2 1 1 2 hhcurveto + 22 6 25 4 23 4 rrcurveto + 1 vlineto + 21 4 19 4 16 3 rrcurveto + -2 -10 -6 -18 -10 vvcurveto + -4 2 -2 4 20 3 39 13 6 vhcurveto + 105 27 84 14 99 31 64 138 rcurveline + -5 -9 -9 -2 -8 hhcurveto + -12 -11 5 10 -9 hvcurveto + -7 25 -10 23 -11 21 rrcurveto + 26 -14 -27 27 -37 hhcurveto + -13 -11 -4 -8 -12 hvcurveto + -61 -42 -42 -95 -27 -75 -60 -11 -60 -10 -60 -11 rrcurveto + 352 74 rmoveto + 1 -2 0 -2 -2 vvcurveto + -3 -2 -2 -4 -1 vhcurveto + -142 -28 14 35 12 32 27 24 rlinecurve + 8 9 9 4 10 hhcurveto + 9 10 -3 -8 10 hvcurveto + 14 -11 13 -18 10 -23 rrcurveto + endchar + + + 261 267 145 rmoveto + -67 -10 -141 -34 -20 74 -14 -37 -13 -42 -12 -48 1 -30 28 -14 27 -3 72 -7 28 11 61 13 -2 -12 -15 -36 19 7 16 6 3 29 7 14 105 27 83 16 99 32 64 137 rcurveline + -24 -10 -18 2 -15 16 -14 48 -21 46 -40 20 -24 12 -23 -2 -21 -14 -61 -42 -41 -94 -27 -75 rrcurveto + 171 41 rmoveto + 3 -7 -2 -4 -6 -1 -141 -28 rcurveline + 14 35 11 32 27 24 44 39 37 -60 13 -30 rrcurveto + endchar + + + 272 277 144 rmoveto + -120 -20 -37 3 -20 6 -33 10 -22 34 5 37 rrcurveto + 2 -3 1 -1 -3 vhcurveto + -84 -159 8 -102 257 67 -2 -11 -4 -15 -2 -8 -1 -5 6 -6 4 1 20 5 -1 32 7 13 107 23 104 28 78 25 63 136 rcurveline + -21 -9 -23 2 -13 15 -12 51 -22 43 -38 21 -96 52 -78 -197 -26 -72 rrcurveto + 170 42 rmoveto + 3 -7 2 -3 -11 -2 -140 -28 rcurveline + 16 34 13 38 28 23 17 14 23 -4 15 -13 16 -14 10 -17 8 -21 rrcurveto + endchar + + + 427 425 168 rmoveto + -71 -17 -102 -19 -82 -4 -59 -4 -59 8 -13 44 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 100 -10 135 32 84 18 -2 -12 -15 -32 19 2 16 6 3 30 7 14 rrcurveto + 105 27 83 17 99 31 64 137 rcurveline + -23 -11 -19 3 -15 17 -14 48 -21 46 -40 20 -24 12 -23 -2 -21 -14 -61 -42 -42 -96 -26 -75 rrcurveto + 171 42 rmoveto + 3 -7 -2 -3 -6 -1 -141 -29 rcurveline + 14 35 11 32 27 24 44 39 37 -59 13 -31 rrcurveto + endchar + + + 150 5 vmoveto + -6 9 0 3 3 vhcurveto + 8 13 16 22 25 28 25 28 53 35 83 42 83 42 58 44 35 44 35 44 24 48 13 51 13 51 -9 31 -33 14 -32 13 -39 4 -45 -7 -45 -7 -33 -12 -22 -15 rrcurveto + -33 -23 -23 -42 -14 -61 -14 -61 5 -39 21 -19 -29 -17 -25 -19 -22 -21 -50 -48 -25 -80 -16 -80 rrcurveto + 399 383 rmoveto + -3 -3 0 0 0 vvcurveto + -43 -31 -42 -20 -49 -20 rrcurveto + -1 1 -1 1 1 vvcurveto + -14 28 -20 22 -11 31 14 11 29 9 45 6 49 6 35 -10 12 -32 rrcurveto + endchar + + + 268 47 -242 rmoveto + 45 97 42 72 39 49 74 92 69 52 87 71 39 32 41 48 45 62 13 19 17 35 18 51 18 51 -7 32 -33 14 -32 13 -39 4 -45 -7 -45 -7 -33 -12 -22 -15 rrcurveto + -33 -24 -23 -42 -12 -62 -12 -62 12 -51 37 -41 -3 -3 rcurveline + -45 -36 -36 -35 -27 -35 -52 -67 -42 -79 -39 -78 -9 -18 rcurveline + 4 29 1 2 -54 -66 -3 -39 -3 -41 1 -30 6 -17 rlinecurve + 8 -23 15 29 18 36 rrcurveto + 339 533 rmoveto + -16 35 -28 31 -14 38 15 12 32 9 49 5 49 5 29 -12 10 -30 -34 -32 -54 -33 -38 -28 rrcurveto + endchar + + + 187 48 -240 rmoveto + 32 70 39 55 49 50 44 46 47 41 48 38 48 38 47 51 45 63 13 19 16 35 18 51 18 51 -7 32 -33 14 -32 13 -39 4 -45 -7 -45 -7 -34 -11 -21 -16 rrcurveto + -33 -23 -23 -42 -12 -62 -12 -62 13 -51 37 -42 -1 -1 -2 -1 -1 -1 -58 -46 -44 -50 -29 -56 -10 -19 -8 -21 -11 -18 -7 -15 rcurveline + 4 29 rlineto + 1 vlineto + -51 -65 -6 -39 -4 -42 2 -29 6 -17 rlinecurve + 8 -23 16 30 18 35 rrcurveto + 256 409 rmoveto + -16 36 -27 31 -15 37 15 12 32 10 49 5 49 5 29 -12 10 -29 -34 -32 -53 -35 -39 -28 rrcurveto + endchar + + + 203 243 250 rmoveto + -95 -30 -57 -30 -20 -29 -36 -53 -14 -45 -21 -61 21 -2 rcurveline + 19 46 51 34 55 17 51 16 68 32 42 18 102 44 82 83 37 109 rrcurveto + 8 24 5 25 23 vvcurveto + 23 -9 16 -19 8 vhcurveto + -32 13 -39 3 -45 -7 -45 -7 -33 -11 -22 -15 -28 -20 -21 -34 -14 -48 -14 -48 3 -47 20 -47 rrcurveto + 94 37 rmoveto + -21 27 -16 30 -13 33 15 12 32 9 49 5 49 5 29 -11 10 -30 -34 -32 -54 -28 -46 -20 rrcurveto + endchar + + + 314 173 206 rmoveto + -3 -3 -9 -4 -15 -7 -27 -12 -22 -14 -20 -15 -24 -19 -18 -22 -11 -24 -6 -13 -15 -32 -3 -13 42 -29 rcurveline + 17 14 29 13 16 14 18 13 20 14 25 15 44 26 42 25 42 25 42 25 41 39 39 55 13 19 16 35 18 51 18 51 -8 33 -33 14 -32 13 -38 4 -45 -7 rrcurveto + -45 -7 -33 -12 -22 -15 -35 -25 -26 -57 -11 -50 -9 -44 -2 -58 30 -16 rrcurveto + 100 29 rmoveto + -16 36 -27 31 -14 37 15 12 31 9 49 5 49 5 30 -11 10 -30 -34 -32 -54 -34 -39 -28 rrcurveto + endchar + + + 180 18 hmoveto + 6 5 5 9 7 hvcurveto + 19 19 37 19 54 21 51 16 68 31 42 18 102 44 82 84 37 109 rrcurveto + 8 24 5 24 23 vvcurveto + 23 -9 16 -19 8 vhcurveto + -32 13 -39 4 -45 -7 -45 -7 -33 -12 -22 -15 -50 -36 -44 -112 35 -89 -45 -20 -43 -21 -44 -21 -44 -21 -30 -39 -17 -55 rrcurveto + -1 vlineto + -10 -12 -5 -10 -9 vvcurveto + -10 9 -13 9 vhcurveto + 319 262 rmoveto + -21 27 -16 31 -13 33 15 12 32 9 49 5 49 5 29 -12 10 -30 -34 -32 -54 -28 -46 -20 rrcurveto + endchar + + + 433 106 333 rmoveto + -2 -1 0 -2 -1 hvcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -42 9 49 -15 60 hhcurveto + 31 35 4 8 40 hvcurveto + 60 11 50 10 42 9 rrcurveto + -2 -10 -6 -16 -10 vvcurveto + -4 3 -2 5 vhcurveto + 2 hlineto + 16 6 3 30 6 14 105 27 84 17 99 31 64 137 rcurveline + -5 -9 -9 -2 -8 hhcurveto + -12 -11 6 10 -9 hvcurveto + -7 25 -9 22 -12 21 rrcurveto + 26 -15 -26 28 -37 hhcurveto + -13 -11 -4 -8 -12 hvcurveto + -61 -42 -43 -96 -26 -75 -41 -6 -47 -8 -52 -11 rrcurveto + -8 -40 -35 -5 -32 hhcurveto + -53 -37 13 35 -17 hvcurveto + -4 7 -2 9 11 vvcurveto + 29 14 40 26 52 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 vhcurveto + 494 -121 rmoveto + 1 -2 0 -2 -1 vvcurveto + -4 -2 -2 -4 -1 vhcurveto + -141 -28 14 35 11 32 27 24 rlinecurve + 8 9 9 4 10 hhcurveto + 9 10 -3 -8 10 hvcurveto + 14 -11 12 -18 11 -23 rrcurveto + endchar + + + 150 5 vmoveto + -6 9 0 3 3 vhcurveto + 8 13 25 25 42 36 42 36 54 37 69 39 69 39 55 49 40 60 13 19 16 36 18 51 18 51 -7 32 -33 14 -32 13 -39 4 -45 -7 -45 -7 -33 -12 -22 -15 rrcurveto + -33 -23 -23 -42 -14 -61 -14 -61 5 -39 21 -19 -29 -17 -25 -19 -22 -21 -50 -48 -25 -80 -16 -80 rrcurveto + 399 383 rmoveto + -3 -3 0 0 0 vvcurveto + -43 -31 -42 -20 -49 -20 rrcurveto + -1 1 -1 1 1 vvcurveto + -14 28 -20 22 -11 31 14 11 29 9 45 6 49 6 35 -10 12 -32 rrcurveto + endchar + + + -83 393 238 rmoveto + -90 -52 -122 -36 -154 -20 rrcurveto + -1 -3 vlineto + -24 -129 4 1 8 2 11 2 rlinecurve + 211 54 130 64 49 74 29 45 21 35 23 54 8 18 -3 14 -12 9 -18 14 -32 10 -46 7 -46 7 -34 3 -21 -1 -18 -38 -19 -35 -17 -39 -5 -12 0 -6 6 -1 rrcurveto + 13 -3 21 -2 30 -1 36 -1 68 -3 7 -24 -2 -3 -3 -3 -6 -3 rrcurveto + endchar + + + 31 507 231 rmoveto + -94 -50 -94 -37 -117 -15 -52 -7 -39 2 -27 10 -24 8 -15 14 -6 21 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 55 -5 55 2 55 9 132 23 111 62 63 95 rrcurveto + 29 45 21 35 23 54 7 18 -2 14 -12 9 -18 14 -31 9 -45 4 -45 4 -35 3 -23 6 -18 -38 -19 -35 -17 -39 -5 -12 0 -6 6 -1 13 -3 22 -1 30 -1 rrcurveto + 30 -1 26 -3 21 -5 20 -5 11 -6 2 -8 -2 -3 -3 -3 -6 -3 rrcurveto + endchar + + + -73 47 9 rmoveto + 65 -36 203 73 94 110 38 44 35 57 16 49 7 21 -3 15 -10 8 -18 14 -33 8 -45 4 -45 4 -34 4 -22 6 rrcurveto + -1 hlineto + -18 -38 -20 -35 -16 -39 -5 -12 0 -6 6 -1 13 -3 22 -2 30 -1 30 -1 27 -3 21 -5 36 -9 3 -10 -21 -13 -187 -99 -163 -24 15 111 rrcurveto + 8 -2 0 -5 -8 vhcurveto + -32 -43 -52 -109 71 -39 rrcurveto + endchar + + + 74 246 16 rmoveto + 44 8 39 9 35 11 107 33 66 55 57 86 21 31 25 42 9 40 4 16 -3 11 -8 7 -19 15 -40 6 -32 5 -33 5 -45 2 -28 7 rrcurveto + -1 hlineto + -18 -38 -19 -35 -16 -39 -6 -12 1 -6 6 -1 13 -3 21 -1 30 -1 36 -1 67 -3 7 -24 -2 -3 -2 -3 -6 -3 -90 -48 -97 -31 -121 -17 -71 -10 -121 -10 -17 60 rrcurveto + -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 49 -5 64 5 77 14 rrcurveto + endchar + + + -96 174 261 rmoveto + -32 -8 -29 -15 -25 -23 -17 -16 -15 -21 -12 -26 -16 -33 -14 -49 -14 -65 rrcurveto + -6 9 0 3 3 vhcurveto + 26 49 39 33 47 25 52 28 62 17 48 32 43 27 37 39 33 50 29 46 22 34 22 54 7 18 -1 14 -12 9 -18 14 -32 8 -45 4 -45 4 -34 4 -23 6 rrcurveto + -1 hlineto + -18 -38 -20 -34 -16 -40 -5 -11 0 -7 6 -1 13 -3 22 -2 30 -1 30 -1 27 -2 21 -5 19 -5 11 -6 3 -8 -1 -2 -4 -4 -6 -4 -74 -38 -52 -24 -80 -20 rrcurveto + endchar + + + 89 146 -51 rmoveto + 38 68 100 71 160 74 59 28 45 40 36 56 29 45 22 35 22 54 7 18 -1 14 -12 9 -18 14 -32 8 -45 4 -45 4 -35 4 -22 6 rrcurveto + -1 hlineto + -18 -38 -20 -35 -16 -39 -5 -12 0 -6 6 -1 13 -3 22 -2 30 -1 30 -1 27 -3 21 -5 20 -5 10 -6 2 -8 -1 -3 -3 -2 -6 -3 -49 -26 3 -1 -53 -15 rrcurveto + -55 -16 -46 -13 -45 -25 -118 -65 -77 -145 -62 -125 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 31 62 31 64 40 71 rrcurveto + endchar + + + 27 520 184 rmoveto + 32 37 1 4 30 52 16 28 0 19 -15 9 -45 28 -118 35 -63 11 -21 -41 -3 -8 -22 -54 -5 -10 0 -5 5 -1 56 -10 86 -28 42 -24 -2 -1 -2 -2 -2 -1 rrcurveto + -1 hlineto + -29 -15 -35 -11 -41 -7 -35 -6 -34 -9 -32 -13 -70 -28 -57 -56 -34 -65 -18 -35 -20 -39 -21 -41 -1 -2 rcurveline + -7 -15 4 29 rlineto + 1 vlineto + -51 -65 -6 -39 -5 -37 1 -29 8 -22 rlinecurve + 6 -17 13 11 19 40 8 20 10 20 11 26 12 27 10 25 11 25 32 72 42 47 70 28 44 18 60 10 48 20 40 17 49 42 29 35 rrcurveto + endchar + + + -58 18 hmoveto + 3 hlineto + 2 5 2 5 4 6 16 25 20 23 25 18 37 24 63 28 49 19 85 33 65 44 48 73 29 45 21 34 23 54 8 18 -2 15 -12 9 -18 14 -32 8 -45 4 rrcurveto + -45 4 -34 4 -23 6 -1 -1 rcurveline + -19 -39 -18 -33 -17 -40 -5 -11 0 -6 6 -1 38 -9 126 11 11 -36 -2 -3 -3 -3 -6 -3 -50 -27 8 2 -56 -16 -50 -15 -43 -11 -44 -16 -48 -17 -35 -23 -22 -29 rrcurveto + -21 -28 -19 -44 -16 -60 -6 -25 -5 -11 -10 -22 11 -1 rcurveline + 1 -1 3 -1 3 1 rrcurveto + endchar + + + -166 318 274 rmoveto + -91 -48 8 9 -89 -41 -61 -29 -41 -35 -20 -42 -3 -6 -14 -34 -3 -6 -1 -3 -1 -4 -2 -5 42 -30 rcurveline + 17 13 29 15 16 14 28 21 23 14 20 7 42 15 32 23 31 33 16 18 19 26 22 34 20 31 20 28 16 34 9 19 13 16 -1 29 -1 7 -3 7 -6 4 rrcurveto + -18 14 -32 12 -45 10 -45 10 -33 8 -23 6 rrcurveto + -1 hlineto + -18 -38 -19 -35 -17 -39 -5 -12 0 -6 6 -1 56 -13 54 -9 51 -18 8 -4 5 -4 1 -6 -1 -3 -4 -3 -6 -3 rrcurveto + endchar + + + -85 392 288 rmoveto + -36 -19 -33 -15 -27 -11 -53 -23 -57 -14 -55 -21 -28 -11 -42 -18 -14 -21 -16 -23 -4 -30 -13 -27 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 11 17 38 38 70 22 57 22 98 37 62 35 52 80 29 45 22 35 22 54 7 18 -1 14 -12 9 -18 14 -33 8 -45 4 rrcurveto + -45 4 -34 4 -23 6 -18 -38 -19 -35 -17 -39 -5 -12 0 -6 6 -1 13 -3 22 -2 30 -1 36 -1 68 -3 6 -24 -1 -3 -3 -2 -6 -4 rrcurveto + endchar + + + 177 83 7 rmoveto + 119 -18 124 16 127 50 127 50 92 83 56 115 5 9 6 14 7 18 7 18 -2 14 -12 9 -18 14 -32 8 -45 4 -45 4 -35 4 -22 6 -19 -38 -19 -34 -16 -40 rrcurveto + -6 -11 0 -7 7 -1 13 -3 21 -1 30 -1 30 -1 27 -3 21 -5 20 -5 11 -6 2 -8 -1 -1 -4 -4 -6 -5 -22 -12 -19 -9 -18 -6 -73 -26 -78 -24 -86 -20 rrcurveto + -101 -23 -119 -12 -45 67 -19 28 8 48 34 68 2 4 0 2 -3 1 -3 1 -2 -2 -2 -2 -10 -14 -15 -23 -20 -34 -20 -34 -15 -34 -11 -36 -11 -36 -2 -32 7 -30 rrcurveto + 7 -30 23 -18 43 -6 rrcurveto + endchar + + + -77 12 2 rmoveto + 30 56 52 39 63 27 76 32 77 24 60 50 16 13 19 23 21 33 35 54 9 15 22 53 7 18 -2 14 -12 9 -18 14 -32 9 -45 4 -45 4 -34 3 -22 6 rrcurveto + -1 hlineto + -18 -38 -20 -34 -16 -39 -5 -12 0 -6 6 -1 13 -3 22 -2 30 -1 30 -1 26 -3 21 -5 20 -5 11 -6 2 -8 -1 -2 -5 -2 -9 -3 -72 -23 -75 -21 -71 -24 rrcurveto + -68 -23 -37 -27 -30 -65 -15 -32 -14 -48 -13 -63 rrcurveto + -6 9 0 3 3 vhcurveto + endchar + + + 67 84 hmoveto + 39 46 6 12 25 hvcurveto + 34 16 29 38 30 41 28 39 26 32 -2 19 -5 51 -72 -16 -26 46 28 24 23 8 38 10 8 15 25 30 10 17 rrcurveto + 17 10 12 23 -14 hhcurveto + -14 -35 -20 -11 -15 hvcurveto + -91 -63 -91 -118 26 -45 11 -19 27 -19 35 -8 17 -4 11 -10 -24 -12 -48 -24 -80 -28 -44 -28 rrcurveto + -16 -25 18 -3 30 hhcurveto + endchar + + + 10 -47 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + endchar + + + 10 -47 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + endchar + + + -117 217 167 rmoveto + 50 226 -122 160 -114 -333 -40 -116 -21 -132 120 31 84 22 27 68 16 74 rrcurveto + -79 98 rmoveto + 13 -9 37 -78 -17 -11 -29 -18 -46 -17 -39 17 -6 3 -9 8 2 4 4 15 42 119 48 -33 rrcurveto + endchar + + + -168 78 135 rmoveto + 8 9 1 3 9 hvcurveto + 32 9 27 17 21 24 13 -189 rcurveline + 74 138 -18 263 rlineto + 44 -12 26 -25 10 vhcurveto + 2 -6 -6 2 -7 hhcurveto + -20 -22 -12 -23 -25 hvcurveto + -9 -8 -14 -18 -18 -26 -33 -47 -37 -65 -15 -61 rrcurveto + -2 -9 -2 -9 -8 vvcurveto + -41 46 -23 32 vhcurveto + 93 153 rmoveto + -7 -1 -7 -1 -6 vhcurveto + -3 -11 -10 -2 -10 hhcurveto + -32 -27 14 20 -10 hvcurveto + -3 5 -2 5 4 vvcurveto + 5 2 4 4 5 vhcurveto + 8 10 10 9 12 10 rrcurveto + 7 8 8 3 10 hhcurveto + 38 7 -36 -40 hvcurveto + endchar + + + 221 343 391 rmoveto + -15 -17 -12 -23 -20 hvcurveto + -47 -54 -40 -67 -33 -81 -148 -24 rcurveline + -23 -130 60 16 61 11 60 16 rlinecurve + -1 vlineto + 2 2 7 0 2 hhcurveto + 11 hlineto + 151 81 67 101 66 hvcurveto + 30 46 17 41 4 38 rrcurveto + 1 11 1 11 11 vvcurveto + 17 -2 16 -3 17 vhcurveto + -5 28 -4 30 -5 31 -7 45 -13 29 -18 12 rrcurveto + 8 -12 -13 3 -13 hhcurveto + -8 -8 -1 -3 -8 hvcurveto + -48 -16 -49 -53 -29 -38 -25 -34 -30 -32 -15 -43 rrcurveto + -1 -1 0 0 vhcurveto + -3 3 -2 6 vhcurveto + 1 1 rlineto + 7 5 2 3 3 hvcurveto + 15 17 14 17 14 20 14 20 17 15 22 11 rrcurveto + 3 7 6 2 6 hhcurveto + 20 17 -18 -12 6 hvcurveto + 28 -58 13 -70 -80 vvcurveto + -11 0 -11 -1 -11 vhcurveto + -33 -21 -41 -15 -50 -9 18 35 16 31 14 29 rrcurveto + 6 12 3 11 13 vvcurveto + 28 -20 57 -31 vhcurveto + -117 -201 rmoveto + 3 1 3 1 3 vhcurveto + 11 24 14 16 17 6 rrcurveto + 1 3 2 0 2 hhcurveto + 13 12 -14 -26 9 hvcurveto + 2 -3 -17 -15 -23 -12 -28 -8 rlinecurve + -1 hlineto + -6 -12 13 9 hvcurveto + endchar + + + 338 445 389 rmoveto + -15 -16 -12 -23 -20 hvcurveto + -47 -54 -40 -67 -33 -81 rrcurveto + -2 vlineto + -66 -14 -147 -38 -22 77 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 41 -4 40 3 38 10 38 10 39 10 40 10 rrcurveto + 1 1 1 1 hhcurveto + 1 11 vlineto + 151 81 67 101 66 hvcurveto + 30 46 16 41 4 38 rrcurveto + 1 11 1 11 11 vvcurveto + 17 -1 16 -3 17 vhcurveto + -5 28 -4 30 -5 31 -7 45 -14 29 -18 12 rrcurveto + 8 -12 -12 3 -13 hhcurveto + -8 -8 -1 -3 -8 hvcurveto + -48 -16 -50 -53 -29 -38 -25 -34 -30 -32 -15 -43 rrcurveto + -1 vlineto + -3 2 -2 6 vhcurveto + 1 1 rlineto + 7 5 2 3 3 hvcurveto + 15 17 14 17 14 20 14 20 17 15 22 11 rrcurveto + 3 7 7 2 6 hhcurveto + 20 16 -18 -12 6 hvcurveto + 28 -58 14 -70 -80 vvcurveto + -11 0 -11 -1 -11 vhcurveto + -33 -21 -41 -15 -50 -9 18 35 16 31 14 29 rrcurveto + 6 12 3 11 13 vvcurveto + 28 -21 57 -31 vhcurveto + -116 -201 rmoveto + 3 1 3 1 3 vhcurveto + 11 24 13 16 17 6 rrcurveto + 1 3 2 0 2 hhcurveto + 13 13 -14 -26 9 hvcurveto + 2 -3 -17 -15 -23 -11 -28 -8 rlinecurve + -2 hlineto + -6 -11 12 9 hvcurveto + endchar + + + 237 195 29 rmoveto + 1 7 7 1 7 hhcurveto + 90 -1 70 24 53 41 60 46 72 107 8 76 6 54 -13 55 -10 62 -29 181 -133 -106 -65 -88 -25 -34 -30 -32 -14 -43 -3 -8 20 1 6 6 31 34 22 45 44 22 rrcurveto + 29 14 24 -21 9 -19 31 -64 14 -82 -4 -94 -34 -21 -42 -16 -49 -9 16 31 17 32 15 32 28 58 -50 113 -72 -84 -50 -58 -39 -70 -31 -75 rrcurveto + 1 vlineto + -33 -7 -38 -11 -33 9 -24 6 -13 30 2 29 1 4 -5 2 -4 -6 -40 -58 -28 -101 65 -32 39 -19 81 33 37 9 rrcurveto + 52 170 rmoveto + 23 49 38 21 22 -63 rrcurveto + 0 1 -1 1 -2 vhcurveto + -18 -15 -25 -12 -25 -8 -6 -2 -18 18 7 15 rrcurveto + endchar + + + 453 422 51 rmoveto + 154 -1 82 66 67 102 30 46 16 42 4 38 6 61 -14 55 -9 55 -7 45 -14 28 -18 13 -18 13 -21 1 -22 -7 -48 -16 -50 -53 -28 -38 -25 -34 -31 -31 -14 -44 rrcurveto + -4 -10 25 7 3 3 16 17 14 18 14 20 14 20 17 14 22 11 30 15 22 -24 9 -16 32 -65 13 -80 -4 -96 -34 -21 -41 -15 -49 -9 16 31 15 32 16 31 rrcurveto + 14 29 -3 32 -20 36 -20 36 -29 -3 -36 -42 -50 -58 -38 -69 -31 -75 -52 -11 -88 -16 -64 -3 -62 -3 -78 3 -12 45 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 rrcurveto + 105 -11 155 36 86 22 rrcurveto + -1 3 13 3 4 hhcurveto + 117 172 rmoveto + -16 -14 -23 -12 -29 -9 -3 -1 -5 3 -6 7 -6 7 -1 7 4 8 11 24 13 15 17 6 17 6 14 -13 11 -31 rrcurveto + -1 1 -1 1 -1 vhcurveto + endchar + + + 263 454 217 rmoveto + 30 23 30 34 30 46 30 46 16 42 4 38 6 61 -14 54 -9 56 -7 45 -14 29 -18 12 -18 12 -21 2 -22 -7 -48 -16 -50 -53 -28 -38 -25 -34 -31 -32 -14 -43 rrcurveto + -3 -10 24 7 3 3 15 17 14 17 14 20 14 20 17 15 22 11 30 14 24 -22 8 -17 32 -65 13 -81 -4 -95 -33 -21 -41 -15 -50 -9 18 35 16 30 14 29 rrcurveto + 14 29 -4 32 -20 36 -20 36 -29 -4 -36 -42 -47 -54 -39 -67 -33 -81 -45 -8 -46 -22 -26 -17 -26 -18 -20 -24 -13 -31 -13 -31 -13 -46 -12 -60 rrcurveto + -6 9 0 3 3 vhcurveto + 24 39 22 29 31 25 32 24 47 20 45 10 rrcurveto + 3 12 10 1 7 hhcurveto + 85 -1 70 21 57 44 rrcurveto + -97 108 rmoveto + -17 -15 -22 -12 -28 -8 -3 -1 -5 3 -6 7 -6 7 -1 7 4 8 11 24 13 15 17 6 17 6 14 -13 11 -31 rrcurveto + 0 0 0 1 -3 vhcurveto + endchar + + + 416 387 148 rmoveto + 85 -1 71 22 57 44 30 23 29 34 30 46 30 46 16 41 4 38 7 61 -14 55 -9 55 -7 45 -14 28 -18 13 -18 13 -21 2 -22 -7 -48 -16 -50 -53 -29 -38 rrcurveto + -25 -33 -30 -33 -15 -43 rrcurveto + -4 -1 3 -2 7 hhcurveto + 7 5 2 3 3 hvcurveto + 15 17 14 18 14 20 14 20 18 15 22 11 30 15 22 -25 9 -16 32 -66 13 -80 -4 -94 -34 -21 -41 -15 -49 -9 16 31 16 32 16 32 14 29 -4 32 -20 35 rrcurveto + -20 35 -28 -3 -36 -42 -50 -58 -39 -68 -31 -76 rrcurveto + 1 vlineto + -3 -1 rlineto + -1 hlineto + -36 -12 -27 -17 -20 -19 -20 -19 -25 -29 -31 -40 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 41 49 44 34 54 30 rrcurveto + -1 vlineto + 4 18 15 6 22 hhcurveto + 116 172 rmoveto + -18 -14 -22 -12 -28 -8 -3 -1 -4 3 -6 7 -6 7 -2 7 4 8 11 24 13 15 17 6 17 6 14 -13 11 -31 rrcurveto + 0 0 -1 2 -3 vhcurveto + endchar + + + 277 466 211 rmoveto + 30 23 30 33 30 46 30 46 16 42 4 38 7 62 -14 53 -9 56 -7 45 -14 29 -18 12 -18 12 -21 3 -22 -7 -48 -16 -50 -54 -29 -38 -25 -33 -30 -32 -15 -43 rrcurveto + -3 -10 24 6 3 3 15 17 15 18 14 20 14 20 17 15 22 11 30 14 23 -24 9 -16 31 -66 13 -79 -4 -95 -33 -21 -41 -16 -50 -9 18 35 16 31 14 29 rrcurveto + 14 29 -4 32 -20 36 -20 36 -28 -4 -36 -42 -47 -54 -40 -68 -33 -81 -15 -4 -33 -12 -13 -6 -62 -26 -36 -46 -27 -63 -14 -31 -12 -33 -14 -32 21 -2 rcurveline + 13 31 16 25 21 19 19 17 25 13 31 12 21 8 22 7 21 7 rrcurveto + 2 1 0 1 2 hvcurveto + 74 23 14 -5 19 -5 20 3 rlinecurve + 52 8 32 16 40 31 rrcurveto + -96 107 rmoveto + -18 -14 -22 -12 -28 -8 -3 -1 -4 2 -6 7 -6 7 -2 7 4 8 11 24 14 16 17 6 17 6 13 -14 11 -31 rrcurveto + 0 1 0 1 -3 vhcurveto + endchar + + + 314 256 103 rmoveto + 86 -1 70 21 56 44 52 40 80 108 8 81 7 62 -15 53 -9 56 -7 45 -13 29 -18 12 -18 12 -21 2 -22 -7 -48 -16 -51 -53 -28 -38 -25 -34 -30 -32 -15 -43 rrcurveto + -3 -10 24 6 3 3 16 17 14 19 14 20 14 20 18 14 21 11 30 14 23 -22 8 -17 32 -65 14 -81 -5 -95 -33 -21 -41 -15 -50 -9 16 31 16 32 16 32 rrcurveto + 14 29 -4 31 -20 36 -20 36 -28 -3 -36 -42 -50 -58 -39 -69 -31 -76 -20 -5 -20 -6 -21 -8 -56 -25 -31 -33 -38 -41 -21 -24 -14 -20 -7 -18 46 -33 rcurveline + 1 2 1 1 2 2 62 39 54 51 90 9 rrcurveto + 116 171 rmoveto + -16 -14 -23 -11 -29 -9 -3 -1 -4 3 -6 7 -6 7 -2 7 4 8 11 24 14 15 17 6 18 6 15 -17 10 -31 rrcurveto + endchar + + + 224 348 425 rmoveto + -15 -17 -11 -23 -19 hvcurveto + -46 -53 -39 -66 -33 -78 rrcurveto + 1 vlineto + -1 -2 0 -2 -1 -2 rrcurveto + -1 1 hlineto + -4 -1 -5 0 -4 -1 rrcurveto + -1 hlineto + -40 -12 -30 -12 -23 -25 -21 -22 -20 -30 -14 -32 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 35 35 37 8 49 15 4 1 10 2 15 4 rrcurveto + 3 2 1 3 hhcurveto + 1 5 4 0 4 hhcurveto + 5 hlineto + 83 69 21 43 55 hvcurveto + 30 23 30 34 30 46 30 46 17 42 4 38 rrcurveto + 1 10 0 9 10 vvcurveto + 17 -1 18 -3 18 vhcurveto + -5 28 -4 29 -5 31 -7 45 -14 29 -18 12 rrcurveto + 8 -12 -12 4 -13 hhcurveto + -8 -8 -1 -3 -8 hvcurveto + -48 -16 -50 -53 -29 -38 -25 -34 -30 -32 -14 -43 rrcurveto + -1 -1 -1 0 vhcurveto + -3 2 -1 6 vhcurveto + 1 1 rlineto + 7 6 1 3 3 hvcurveto + 15 17 14 18 14 20 14 20 17 15 22 11 rrcurveto + 3 7 6 2 6 hhcurveto + 20 16 -18 -12 6 hvcurveto + 28 -58 14 -69 -81 vvcurveto + -11 0 -11 -1 -11 vhcurveto + -33 -21 -41 -16 -50 -9 18 35 16 31 14 29 rrcurveto + 6 11 2 12 13 vvcurveto + 28 -20 57 -31 vhcurveto + -112 -195 rmoveto + 3 1 3 1 3 vhcurveto + 11 24 14 15 17 6 rrcurveto + 1 3 2 0 2 hhcurveto + 13 12 -13 -26 9 hvcurveto + 2 -4 -18 -14 -22 -12 -28 -8 rlinecurve + -1 hlineto + -6 -12 13 9 hvcurveto + endchar + + + 543 651 413 rmoveto + -15 -17 -11 -23 -19 hvcurveto + -50 -58 -38 -68 -32 -76 -41 -8 -48 -11 -57 -12 rrcurveto + -10 -46 -42 -5 -38 hhcurveto + -58 -43 13 34 -23 hvcurveto + -7 9 -2 12 15 vvcurveto + 28 12 37 23 47 vhcurveto + 1 2 0 1 1 vvcurveto + 2 -1 0 -1 1 vhcurveto + -3 hlineto + -2 -1 0 -2 -1 hvcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -55 21 -25 57 -8 vhcurveto + -3 18 19 0 20 hhcurveto + 43 49 6 12 54 hvcurveto + 79 17 68 15 58 15 rrcurveto + 1 hlineto + 2 7 7 0 6 hhcurveto + 6 hlineto + 150 81 68 100 65 hvcurveto + 30 46 17 41 4 38 rrcurveto + 1 10 0 11 10 vvcurveto + 51 -10 40 -8 49 vhcurveto + -7 45 -13 29 -18 12 rrcurveto + 8 -12 -12 4 -13 hhcurveto + -8 -9 -1 -3 -8 hvcurveto + -48 -16 -49 -53 -29 -38 -25 -34 -31 -32 -14 -43 rrcurveto + -1 -1 -1 0 vhcurveto + -3 3 -1 6 vhcurveto + 1 hlineto + 7 4 2 3 3 hvcurveto + 16 17 14 18 14 20 14 20 17 15 22 11 rrcurveto + 3 7 7 2 6 hhcurveto + 20 15 -19 -12 6 hvcurveto + 28 -58 14 -68 -81 vvcurveto + -11 1 -11 -1 -11 vhcurveto + -33 -21 -42 -16 -50 -9 19 37 16 32 13 26 rrcurveto + 6 11 3 12 13 vvcurveto + 28 -21 57 -31 vhcurveto + -114 -186 rmoveto + 3 1 2 2 3 vhcurveto + 11 24 13 16 17 6 rrcurveto + 1 3 2 0 2 hhcurveto + 13 13 -13 -26 9 hvcurveto + 0 0 -2 1 -2 vhcurveto + -16 -13 -22 -11 -29 -10 rrcurveto + -2 hlineto + -6 -12 14 8 hvcurveto + endchar + + + 266 457 191 rmoveto + 30 23 29 34 30 46 30 46 17 41 4 38 6 61 -14 54 -9 56 -7 45 -14 29 -18 12 -18 12 -21 3 -22 -7 -48 -16 -50 -53 -28 -38 -25 -34 -31 -32 -14 -43 rrcurveto + -3 -10 24 6 3 3 15 17 14 18 14 20 14 20 17 15 22 11 30 14 23 -23 8 -17 32 -65 13 -80 -4 -95 -33 -21 -41 -16 -50 -9 18 35 16 31 14 29 rrcurveto + 14 29 -3 32 -20 36 -20 36 -29 -4 -36 -42 -46 -54 -40 -67 -34 -81 -15 -4 -32 -13 -14 -6 -47 -20 -32 -27 -17 -33 -17 -33 -19 -43 -23 -52 rrcurveto + -1 vlineto + 20 -4 21 41 27 27 33 14 rlinecurve + 33 14 32 12 34 11 49 12 43 5 36 -1 36 -1 44 19 49 38 rrcurveto + -97 107 rmoveto + -17 -15 -23 -11 -28 -8 -3 -1 -4 2 -6 7 -6 7 -2 7 4 8 11 24 14 16 17 6 17 6 13 -14 11 -31 rrcurveto + 0 1 0 1 -3 vhcurveto + endchar + + + -152 217 -273 rmoveto + 7 11 15 28 13 hvcurveto + 1 3 1 1 1 vvcurveto + 16 137 -8 -16 41 291 rlineto + 2 vlineto + 4 -1 2 -3 -2 -1 -1 -1 -3 vhcurveto + -90 -36 -67 -11 -113 -15 -19 -131 rcurveline + 59 15 108 25 58 15 -19 -232 rcurveline + -1 -15 -1 -14 -12 vvcurveto + -19 1 -36 12 vhcurveto + endchar + + + 22 39 176 rmoveto + -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 52 -5 51 4 51 11 51 11 50 12 49 13 -19 -232 rcurveline + -4 -41 2 -29 6 -17 6 -17 13 11 19 40 1 2 1 2 1 2 15 136 rcurveline + -8 -15 42 290 2 10 -4 2 -9 -6 rlinecurve + -69 -28 -110 -30 -94 1 rrcurveto + -50 -51 10 37 -11 hvcurveto + endchar + + + -107 258 -244 rmoveto + 14 137 -7 -16 41 291 1 7 -6 2 -6 -3 rlinecurve + -48 -19 -45 -14 -51 -10 -26 -3 -24 0 -16 4 -26 7 -14 34 5 30 rrcurveto + 3 -2 0 -2 -3 vhcurveto + -42 -57 -33 -107 67 -33 45 -22 110 42 39 10 -19 -232 rcurveline + -7 -83 11 -52 38 81 rrcurveto + endchar + + + 105 470 -217 rmoveto + 15 136 -8 -15 42 290 1 9 -4 2 -8 -5 rlinecurve + -19 -7 -34 -11 -48 -13 -82 -23 -111 -23 -99 8 -43 3 -26 15 -7 27 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 57 -6 66 5 72 16 72 16 65 14 56 15 -19 -232 rcurveline + -4 -41 2 -30 6 -17 6 -17 13 12 19 40 1 2 1 2 1 2 rrcurveto + endchar + + + 35 375 -20 rmoveto + -1 -1 rlineto + -1 vlineto + -4 -51 -4 -41 2 -30 6 -17 rlinecurve + 6 -17 13 12 19 40 rrcurveto + 1 3 1 2 1 vvcurveto + 15 136 -8 -16 8 57 9 56 8 57 rlinecurve + 1 4 3 30 2 20 -6 31 rlinecurve + -8 41 -23 20 -37 -4 -37 -4 -40 -13 -43 -23 -61 -32 -97 -69 -41 -40 -21 -38 -20 -43 -18 -41 rrcurveto + -2 7 -10 3 3 vhcurveto + 11 18 14 16 15 14 38 34 19 19 49 32 40 27 60 33 61 -6 25 -3 18 -15 10 -29 15 -46 -4 -60 -6 -54 rrcurveto + endchar + + + 219 583 -63 rmoveto + 15 136 -8 -15 41 290 2 10 -3 2 -9 -6 rlinecurve + -49 -19 -42 -13 -35 -7 -80 -16 -54 -19 -58 -44 -31 -24 -35 -38 -41 -52 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 34 41 35 38 43 31 41 29 39 17 39 6 39 6 44 9 50 13 -19 -232 rcurveline + -4 -41 2 -30 6 -17 6 -17 13 12 19 40 rrcurveto + endchar + + + -1 335 134 rmoveto + 6 -35 -2 -63 -1 -46 -1 -32 -7 -194 -2 -28 -4 -42 2 -29 6 -17 6 -17 13 11 19 41 1 2 1 2 1 2 7 121 rcurveline + 5 115 6 92 9 69 9 69 3 52 -2 34 -2 33 -19 22 -37 10 -37 10 -34 -2 -32 -14 -83 -38 -82 -79 -40 -80 -13 -27 -17 -28 -9 -30 rrcurveto + -11 -4 1 -6 5 hhcurveto + 5 4 2 5 3 hvcurveto + 14 22 12 23 13 23 28 50 62 42 61 15 30 7 28 1 24 -7 24 -7 14 -16 6 -27 rrcurveto + endchar + + + -29 287 210 rmoveto + -54 -3 -48 -31 -43 -59 -43 -59 -33 -52 -23 -45 -17 -29 -15 -34 -11 -33 45 -33 rcurveline + 6 14 6 10 8 18 18 39 28 46 36 56 36 56 44 27 53 -1 32 -1 10 -36 -12 -72 -2 -13 -2 -11 -1 -10 -4 -42 2 -30 6 -17 8 -22 15 27 18 36 14 136 rcurveline + -8 -15 3 18 4 22 4 25 rlinecurve + 8 47 10 64 -45 5 -23 3 -16 0 -9 -1 rrcurveto + endchar + + + -51 16 -1 rmoveto + 6 5 4 10 7 hvcurveto + 1 hlineto + 9 10 64 28 20 hhcurveto + 41 11 80 15 38 10 -18 -232 rcurveline + -1 -15 -1 -13 -12 vvcurveto + -19 1 -36 12 7 11 14 28 13 vhcurveto + 1 2 0 2 1 2 15 137 rcurveline + -8 -16 42 290 rlineto + 3 vlineto + 4 -1 3 -3 -2 -2 -1 -2 -3 vhcurveto + -101 -40 4 5 -110 -16 -19 -3 -19 -7 -18 -10 -25 -14 -33 -46 -17 -39 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 vhcurveto + endchar + + + 216 549 -245 rmoveto + 7 11 14 28 13 hvcurveto + 1 2 1 2 1 2 14 136 rcurveline + -7 -15 41 290 rlineto + 4 vlineto + 3 -1 2 -3 -2 -2 0 -2 -3 vhcurveto + -49 -20 -65 -18 -80 -16 -80 -16 -67 -11 -56 -6 rrcurveto + -1 -13 -12 -1 -11 hhcurveto + -42 -33 8 18 -24 hvcurveto + -12 9 -7 15 20 vvcurveto + 30 14 42 27 53 vhcurveto + 1 2 0 1 1 vvcurveto + 2 -1 0 -2 1 vhcurveto + -2 hlineto + -2 -1 0 -2 -1 hvcurveto + -10 -15 -15 -24 -20 -34 -20 -34 -15 -34 -11 -36 rrcurveto + -7 -22 -3 -21 -20 vvcurveto + -12 1 -11 3 -11 vhcurveto + -45 10 55 -13 63 hhcurveto + 51 60 8 16 71 hvcurveto + 98 22 81 21 63 16 -19 -232 rcurveline + -1 -15 -1 -14 -12 vvcurveto + -19 1 -36 12 vhcurveto + endchar + + + -35 304 86 rmoveto + -4 -36 -3 -86 -3 -38 -4 -41 1 -30 6 -17 6 -17 13 12 19 40 1 2 1 1 1 2 16 136 rcurveline + -8 -14 14 100 7 41 14 47 -3 48 rlinecurve + -3 33 -19 22 -37 10 -37 10 -34 -2 -32 -14 -43 -20 -34 -27 -27 -34 -36 -47 -28 -51 -28 -55 -2 -4 -26 -56 12 -1 rrcurveto + 5 4 2 5 3 hvcurveto + 14 21 12 24 12 23 16 28 22 25 30 20 44 30 66 28 49 -37 20 -15 7 -28 -4 -40 rrcurveto + endchar + + + 377 493 350 rmoveto + -15 -17 -11 -23 -20 hvcurveto + -47 -54 -40 -68 -33 -81 -317 -11 rcurveline + -4 -1 -1 -2 -2 vvcurveto + -2 3 -4 6 -3 vhcurveto + 138 -62 rlineto + -18 40 32 -8 23 hhcurveto + 3 3 -1 1 3 hvcurveto + 2 21 29 2 36 hhcurveto + 17 hlineto + 151 81 66 101 66 hvcurveto + 30 46 17 42 4 38 rrcurveto + 1 11 1 10 11 vvcurveto + 17 -2 17 -3 17 vhcurveto + -5 28 -4 29 -5 31 -7 45 -14 29 -18 12 rrcurveto + 8 -12 -12 4 -13 hhcurveto + -8 -8 -1 -3 -8 hvcurveto + -48 -16 -50 -53 -29 -38 -25 -34 -29 -32 -15 -43 rrcurveto + -1 -1 -1 0 vhcurveto + -3 2 -1 6 vhcurveto + 1 hlineto + 7 6 2 3 3 hvcurveto + 15 17 14 18 14 20 14 20 17 15 22 11 rrcurveto + 3 7 6 2 6 hhcurveto + 20 17 -19 -12 6 hvcurveto + 28 -58 13 -69 -80 vvcurveto + -11 0 -11 -1 -11 vhcurveto + -33 -21 -41 -16 -50 -9 18 35 16 31 14 29 rrcurveto + 6 12 3 12 13 vvcurveto + 28 -20 56 -31 vhcurveto + -115 -186 rmoveto + 3 1 2 1 3 vhcurveto + 11 24 14 16 17 6 rrcurveto + 1 3 2 0 2 hhcurveto + 13 12 -14 -26 9 hvcurveto + 2 -3 -18 -14 -22 -12 -28 -8 rlinecurve + -1 0 -1 0 hvcurveto + -6 -12 14 9 hvcurveto + endchar + + + 137 352 22 rmoveto + -10 41 37 -5 34 hhcurveto + 48 40 10 20 34 hvcurveto + 58 34 48 45 38 59 23 35 14 36 2 34 rrcurveto + 5 vlineto + 32 -18 23 -37 18 vhcurveto + -27 10 -35 17 -40 22 rrcurveto + 14 -26 -23 7 -20 hhcurveto + -11 -11 -2 -5 -9 hvcurveto + -18 -9 -17 -16 -16 -23 rrcurveto + -15 -21 -7 -13 -3 vvcurveto + -49 -58 -44 -76 -33 -74 -132 -22 -28 2 -149 -6 rrcurveto + -4 -1 -1 -2 -2 vvcurveto + -2 3 -4 6 -3 vhcurveto + 138 -62 rlineto + -18 41 31 -8 22 hhcurveto + 4 4 -1 1 3 hvcurveto + 22 4 34 7 45 11 rrcurveto + 27 166 rmoveto + 5 2 6 4 6 vhcurveto + 18 24 16 27 31 11 rrcurveto + 13 -6 24 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -25 -12 -24 -8 -21 -1 rrcurveto + -9 5 -14 12 15 vvcurveto + 305 13 rmoveto + -4 -2 -5 -4 -4 vhcurveto + -11 -11 -18 -9 -23 -8 rrcurveto + -11 -31 -55 -16 -37 hhcurveto + -4 hlineto + 29 40 26 43 18 50 24 -10 17 -6 10 -4 rrcurveto + 6 -2 55 -25 -18 vvcurveto + endchar + + + -50 178 42 rmoveto + -10 41 38 -5 34 hhcurveto + 47 40 10 20 34 hvcurveto + 58 34 48 45 39 59 23 35 13 36 2 34 rrcurveto + 5 vlineto + 32 -18 23 -36 18 vhcurveto + -27 10 -35 17 -40 22 rrcurveto + 14 -26 -23 7 -20 hhcurveto + -11 -11 -2 -5 -10 hvcurveto + -18 -9 -16 -16 -16 -23 rrcurveto + -15 -21 -7 -13 -3 vvcurveto + -48 -58 -45 -76 -33 -74 -119 -21 rcurveline + -21 -127 4 1 6 1 4 1 rlinecurve + 192 205 rmoveto + 5 2 6 4 6 vhcurveto + 18 24 15 27 31 11 rrcurveto + 14 -6 24 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -26 -12 -23 -8 -21 -1 rrcurveto + -9 5 -14 12 15 vvcurveto + 305 13 rmoveto + -4 -3 -5 -4 -4 vhcurveto + -11 -11 -17 -9 -23 -8 rrcurveto + -11 -31 -55 -16 -37 hhcurveto + -4 hlineto + 29 40 26 43 18 50 24 -10 16 -6 10 -4 rrcurveto + 6 -2 56 -25 -18 vvcurveto + endchar + + + 128 355 42 rmoveto + 98 -24 79 4 58 34 58 34 48 46 38 59 23 35 14 36 2 34 2 34 -18 25 -39 19 -27 10 -35 17 -40 22 -40 22 -33 5 -27 -13 -18 -9 -17 -15 -16 -24 rrcurveto + -16 -24 -8 -12 2 -1 -49 -58 -44 -76 -33 -74 -28 -4 rcurveline + -1 hlineto + -1 -2 -52 -9 -52 -5 -52 1 rlinecurve + -52 1 -31 16 -9 30 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 51 -5 64 6 77 14 rrcurveto + 1 hlineto + 205 270 rmoveto + 13 -5 10 -14 9 -24 9 -24 -3 -16 -16 -7 -25 -12 -24 -8 -21 -1 -13 7 -19 22 15 20 18 24 16 27 31 11 rrcurveto + 218 -46 rmoveto + 43 -27 -58 -24 -27 -10 -31 -11 -61 -18 -35 2 29 40 26 43 18 50 52 -21 -1 4 45 -28 rrcurveto + endchar + + + 21 248 36 rmoveto + 197 -50 106 86 77 117 47 71 14 76 -78 37 -54 20 -95 69 -53 -26 -35 -17 -41 -67 3 -2 -49 -59 -43 -74 -34 -75 -34 -5 -56 -14 -36 9 -27 7 -14 38 8 32 rrcurveto + 1 0 0 -1 -1 vhcurveto + -44 -55 -37 -114 69 -34 47 -23 124 44 39 9 rrcurveto + 99 245 rmoveto + 26 -10 28 -65 -32 -15 -22 -11 -25 -8 -24 -2 -15 8 -14 23 13 18 18 24 15 27 32 11 rrcurveto + 218 -46 rmoveto + 71 -44 -197 -45 -43 1 29 40 26 43 18 50 49 -19 6 -1 41 -25 rrcurveto + endchar + + + 197 424 57 rmoveto + 98 -25 78 4 58 34 58 34 48 46 39 59 23 36 13 35 2 34 2 34 -18 26 -39 19 -27 10 -34 16 -40 22 -75 42 -41 -25 -36 -51 -16 -23 -7 -12 2 -1 rrcurveto + -49 -59 -44 -75 -33 -74 -45 -9 -83 -19 -58 -5 -68 -6 -78 3 -15 49 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 55 -5 61 4 67 14 67 14 61 14 57 14 rrcurveto + 98 244 rmoveto + 13 -5 11 -14 9 -24 9 -24 -3 -16 -16 -7 -25 -12 -24 -7 -22 -2 -13 7 -18 22 15 20 18 24 14 27 32 11 rrcurveto + 219 -45 rmoveto + 43 -28 -57 -23 -28 -10 -31 -11 -61 -18 -35 1 29 40 26 42 18 51 52 -21 -1 4 45 -27 rrcurveto + endchar + + + 3 230 159 rmoveto + 98 -25 79 5 58 34 58 34 48 46 39 59 23 35 13 35 2 34 2 34 -18 26 -39 19 -27 10 -35 16 -40 22 -75 42 -40 -25 -36 -51 -16 -23 -8 -12 2 -1 rrcurveto + -49 -59 -43 -75 -33 -74 -3 -1 rcurveline + -1 -1 hlineto + -34 -7 -29 -12 -23 -16 -23 -16 -22 -31 -20 -46 -21 -47 -7 -31 -10 -52 rrcurveto + -6 9 0 3 3 vhcurveto + 42 67 52 48 62 27 rrcurveto + 379 214 rmoveto + 43 -28 -58 -23 -27 -10 -31 -11 -61 -17 -35 1 29 40 26 42 18 51 52 -21 -1 3 45 -27 rrcurveto + -218 45 rmoveto + 13 -5 11 -14 9 -24 9 -24 -3 -16 -16 -7 -26 -12 -24 -7 -21 -2 -13 7 -18 22 15 20 18 25 14 26 32 11 rrcurveto + endchar + + + 234 461 194 rmoveto + 98 -25 79 5 58 34 58 34 48 46 39 59 23 36 13 34 2 34 2 34 -18 26 -39 19 -27 10 -35 16 -40 22 -75 41 -40 -24 -36 -51 -16 -23 -8 -12 2 -1 rrcurveto + -49 -59 -43 -75 -34 -74 -36 -6 -36 -18 -36 -31 -100 -87 -91 -139 -61 -122 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 8 -23 15 29 18 35 40 85 37 75 35 63 60 107 103 72 139 33 rrcurveto + 99 244 rmoveto + 13 -5 10 -14 9 -24 9 -24 -2 -16 -16 -7 -26 -12 -24 -6 -21 -2 -13 7 -19 21 15 20 18 24 16 27 31 11 rrcurveto + 218 -45 rmoveto + 43 -27 -58 -24 -27 -10 -31 -11 -61 -17 -35 1 29 40 26 42 18 51 52 -21 -1 3 45 -27 rrcurveto + endchar + + + 64 291 157 rmoveto + 98 -25 78 4 58 34 58 34 48 47 39 59 23 35 13 35 2 34 2 34 -18 27 -39 18 -27 10 -34 16 -40 22 -75 42 -41 -24 -36 -52 -16 -24 -7 -12 2 -1 rrcurveto + -49 -58 -44 -75 -33 -75 -64 -10 -45 -19 -29 -29 -29 -29 -25 -36 -20 -43 -7 -13 -6 -12 -7 -13 -2 -4 -24 -53 12 -1 rrcurveto + 5 4 2 5 3 hvcurveto + 30 49 38 34 48 19 48 19 52 16 56 13 rrcurveto + 99 244 rmoveto + 13 -5 10 -14 9 -24 9 -24 -3 -16 -16 -7 -25 -12 -24 -6 -22 -2 -13 7 -18 21 15 20 18 24 15 27 32 11 rrcurveto + 218 -46 rmoveto + 43 -27 -58 -24 -27 -10 -31 -11 -62 -17 -35 2 29 40 27 41 18 51 52 -21 -1 4 45 -28 rrcurveto + endchar + + + 33 69 19 rmoveto + 8 6 1 0 8 6 37 25 37 20 37 16 29 13 21 8 13 3 99 -25 78 5 58 34 58 34 49 47 38 59 23 35 13 35 2 34 2 34 -18 26 -39 19 rrcurveto + -27 10 -35 16 -40 22 -40 22 -33 5 -27 -13 -18 -9 -17 -16 -16 -23 -16 -23 -8 -13 2 -1 -49 -59 -42 -75 -34 -74 -65 -30 -71 -18 -40 -51 -16 -22 -17 -35 -14 -36 42 -30 rcurveline + 2 1 3 1 1 1 7 6 7 5 7 5 rrcurveto + 290 342 rmoveto + 13 -6 11 -14 9 -24 9 -24 -4 -15 -16 -7 -25 -12 -23 -8 -22 -1 -12 7 -20 22 15 19 18 24 16 28 31 11 rrcurveto + 218 -46 rmoveto + 44 -27 -57 -24 -28 -10 -31 -11 -62 -17 -35 1 29 40 26 42 18 51 53 -21 -2 4 45 -28 rrcurveto + endchar + + + 40 16 -1 rmoveto + 6 5 5 9 7 hvcurveto + 10 10 19 8 27 9 59 12 61 16 58 13 rrcurveto + -10 41 37 -6 34 hhcurveto + 47 41 10 20 34 hvcurveto + 58 34 48 46 38 59 23 35 14 36 2 34 rrcurveto + 5 vlineto + 32 -18 23 -37 18 vhcurveto + -27 10 -35 17 -40 22 rrcurveto + 14 -26 -23 7 -20 hhcurveto + -11 -11 -2 -5 -9 hvcurveto + -18 -9 -17 -16 -16 -23 rrcurveto + -15 -21 -7 -12 -3 vvcurveto + -1 vlineto + -48 -58 -45 -76 -33 -74 -67 -10 rcurveline + -1 -7 -6 -2 -3 hhcurveto + 1 vlineto + -20 -3 -19 -7 -18 -10 -25 -14 -33 -47 -17 -39 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 vhcurveto + 279 249 rmoveto + 5 2 5 4 6 vhcurveto + 18 24 16 27 31 11 rrcurveto + 14 -6 23 -31 -29 vvcurveto + -11 -4 -8 -10 -5 vhcurveto + -26 -12 -24 -8 -21 -1 rrcurveto + -9 5 -14 13 15 vvcurveto + 305 12 rmoveto + -4 -2 -4 -4 -4 vhcurveto + -11 -11 -18 -10 -23 -8 rrcurveto + -11 -31 -55 -16 -37 hhcurveto + -4 hlineto + 29 39 26 43 18 51 24 -10 17 -6 10 -4 rrcurveto + 6 -2 55 -25 -18 vvcurveto + endchar + + + 207 106 334 rmoveto + -2 -1 0 -2 -1 hvcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -56 21 -24 57 -8 vhcurveto + -3 21 21 -1 21 hhcurveto + 38 39 4 9 40 hvcurveto + 63 14 59 14 56 13 rrcurveto + -10 41 38 -5 34 hhcurveto + 47 40 9 20 34 hvcurveto + 58 34 48 47 39 59 23 35 13 35 2 34 rrcurveto + 4 vlineto + 32 -18 25 -37 18 vhcurveto + -27 10 -34 16 -40 22 rrcurveto + 14 -26 -23 7 -20 hhcurveto + -11 -11 -1 -5 -9 hvcurveto + -18 -9 -17 -17 -16 -23 rrcurveto + -15 -21 -8 -12 -3 vvcurveto + 1 -1 -49 -58 -44 -76 -33 -74 rlinecurve + -38 -6 -42 -7 -48 -8 rrcurveto + -6 -29 -27 -3 -24 hhcurveto + -57 -40 14 40 -17 hvcurveto + -3 7 -2 8 10 vvcurveto + 28 13 40 25 50 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 vhcurveto + 359 -114 rmoveto + 6 2 5 4 6 vhcurveto + 18 24 15 27 32 11 rrcurveto + 13 -6 24 -31 -29 vvcurveto + -11 -5 -8 -10 -5 vhcurveto + -25 -12 -24 -7 -22 -2 rrcurveto + -9 5 -13 12 15 vvcurveto + 305 13 rmoveto + -4 -2 -4 -4 -4 vhcurveto + -11 -11 -18 -10 -23 -8 rrcurveto + -11 -31 -56 -15 -37 hhcurveto + -4 hlineto + 29 40 27 42 18 50 24 -10 17 -6 10 -4 rrcurveto + 6 -2 55 -25 -18 vvcurveto + endchar + + + 30 257 105 rmoveto + 98 -25 78 6 58 34 58 34 48 46 39 59 23 35 13 35 2 34 2 34 -18 26 -39 19 -27 10 -34 16 -40 22 -75 42 -41 -24 -36 -52 -16 -24 -7 -12 2 -1 rrcurveto + -49 -58 -44 -76 -33 -74 -63 -10 -46 -19 -29 -29 -29 -29 -25 -36 -20 -43 rrcurveto + -6 -13 -1 1 0 vvcurveto + -1 vlineto + 18 -32 31 31 35 23 42 14 rlinecurve + 41 14 44 12 46 11 rrcurveto + 98 246 rmoveto + 13 -5 11 -15 9 -24 9 -24 -3 -16 -16 -7 -25 -12 -24 -7 -22 -1 -13 7 -18 21 15 20 18 24 14 28 32 11 rrcurveto + 219 -46 rmoveto + 43 -27 -58 -25 -27 -10 -31 -11 -61 -17 -35 2 29 40 26 42 18 51 53 -21 -2 4 45 -28 rrcurveto + endchar + + + -117 155 511 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + 62 -344 rmoveto + 50 226 -122 160 -114 -333 -40 -116 -21 -132 120 31 84 22 27 68 16 74 rrcurveto + -79 98 rmoveto + 13 -9 37 -78 -17 -11 -29 -18 -46 -17 -39 17 -6 3 -9 8 2 4 4 15 42 119 48 -33 rrcurveto + endchar + + + -117 217 167 rmoveto + 50 226 -122 160 -114 -333 -40 -116 -21 -132 120 31 84 22 27 68 16 74 rrcurveto + -79 98 rmoveto + 13 -9 37 -78 -17 -11 -29 -18 -46 -17 -39 17 -6 3 -9 8 2 4 4 15 42 119 48 -33 rrcurveto + endchar + + + -188 114 142 rmoveto + -2 hlineto + -9 -7 -6 -12 -5 hvcurveto + -91 -237 32 21 46 109 rlineto + -8 22 33 -9 34 hhcurveto + 22 27 2 6 34 hvcurveto + 36 129 rlineto + -4 -29 -26 -2 -21 hhcurveto + -41 -25 7 4 -30 hvcurveto + endchar + + + 32 298 208 rmoveto + -2 vlineto + -87 -37 -85 -14 -104 -22 -22 -133 rcurveline + 100 28 17 5 23 8 29 11 rlinecurve + 47 17 16 7 30 21 -1 -2 -2 -4 -2 -5 -15 -29 -15 -33 -14 -40 rrcurveto + -7 -20 -4 -20 -20 vvcurveto + -21 4 -20 7 -21 vhcurveto + -19 7 14 -23 26 hhcurveto + 45 24 39 29 17 hvcurveto + 18 32 6 45 8 40 rrcurveto + -24 -20 -16 -28 -45 hhcurveto + -27 -16 26 24 5 1 4 1 5 hvcurveto + 4 21 5 19 6 17 4 14 8 14 4 15 rrcurveto + 53 53 32 59 90 vvcurveto + 36 -8 37 -9 22 vhcurveto + -11 26 -77 -113 rlineto + 10 -29 21 -56 -34 vvcurveto + endchar + + + 131 307 149 rmoveto + -13 -53 -56 -7 -58 hhcurveto + -58 -34 15 33 -9 hvcurveto + -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 39 -4 45 2 51 6 51 6 44 14 37 20 11 6 11 6 11 8 -1 -2 0 -1 -1 -1 -14 -32 -17 -33 -15 -42 rrcurveto + -14 -40 -1 -41 15 -41 8 -22 15 -24 31 4 40 6 21 33 17 29 17 32 7 45 8 41 -10 -13 -9 -14 -12 -10 -17 -13 -40 -12 -19 20 -27 29 15 48 12 33 rrcurveto + 4 14 8 15 4 15 5 2 4 6 3 4 41 45 25 59 8 67 2 16 -3 22 -7 30 -7 30 -3 13 -3 -4 -77 -113 rcurveline + 14 -40 7 -31 -1 -21 -20 -9 -26 -8 -32 -8 rrcurveto + -1 -2 -1 -1 hhcurveto + endchar + + + 104 367 194 rmoveto + -3 vlineto + -49 -21 -46 -17 -45 -13 rrcurveto + -7 -23 -24 -4 -24 hhcurveto + -23 -25 4 6 -24 hvcurveto + -21 5 -14 26 27 vvcurveto + 5 1 5 1 5 vhcurveto + 2 -1 0 0 -1 0 0 -2 -1 vhcurveto + -21 -28 -16 -36 -9 -44 rrcurveto + -2 -9 -1 -10 -8 vvcurveto + -52 46 -26 55 22 24 4 8 26 vhcurveto + 70 22 45 17 45 32 -17 -34 -16 -34 -16 -45 rrcurveto + -7 -20 -5 -20 -20 vvcurveto + -21 5 -20 7 -21 vhcurveto + -19 7 13 -23 26 hhcurveto + 45 24 39 29 17 hvcurveto + 17 32 8 45 7 41 rrcurveto + -24 -20 -15 -29 -45 hhcurveto + -27 -16 26 24 5 0 4 1 5 hvcurveto + 4 21 5 19 6 17 4 14 8 15 4 15 36 31 32 57 9 41 rrcurveto + 5 26 3 24 22 vvcurveto + 37 -8 35 -9 22 vhcurveto + -11 27 -77 -113 rlineto + 10 -29 21 -55 -34 vvcurveto + endchar + + + 118 349 305 rmoveto + 10 -28 22 -60 -1 -33 -58 -25 -70 -25 -77 -3 -59 -2 -65 6 -12 43 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 101 -10 110 26 77 54 -17 -34 -16 -34 -16 -45 rrcurveto + -14 -40 -1 -40 15 -41 8 -22 16 -24 31 4 40 6 21 33 17 29 18 32 6 44 7 41 -7 -10 0 1 -7 -10 -5 -7 -5 -5 -6 -5 -17 -13 -41 -13 -19 20 rrcurveto + -27 29 16 48 12 33 4 14 8 15 4 15 36 34 32 53 9 42 13 61 -3 62 -19 44 -12 27 rcurveline + endchar + + + 184 443 299 rmoveto + -72 -31 -88 -16 -77 -26 -65 -19 -46 -33 -25 -45 -25 -45 -22 -43 -20 -42 14 1 rcurveline + 64 56 48 33 33 11 33 11 50 15 67 21 42 13 21 5 33 24 -2 -4 -2 -3 -2 -3 -11 -18 -15 -34 -18 -51 -14 -40 0 -41 15 -40 8 -22 15 -23 31 4 rrcurveto + 40 6 21 32 17 29 18 31 6 45 8 41 -10 -13 -9 -13 -12 -10 -17 -14 -40 -13 -19 21 -27 29 15 49 12 33 4 14 8 14 4 15 36 33 32 55 9 42 rrcurveto + 13 61 -3 61 -19 45 -11 27 rcurveline + -76 -114 10 -29 22 -59 -2 -33 rlinecurve + endchar + + + 257 481 448 rmoveto + 10 -28 23 -60 -2 -33 -43 -18 -32 -11 -20 -3 -20 -3 -30 -15 -39 -26 -46 -31 -43 -43 -43 -55 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 34 41 35 38 43 31 21 15 24 11 25 7 37 11 36 16 28 22 -17 -34 -16 -35 -16 -45 rrcurveto + -14 -40 0 -41 15 -40 8 -22 15 -24 31 4 40 6 21 34 17 28 18 32 6 44 8 41 -10 -13 -9 -13 -12 -10 -17 -14 -41 -13 -19 21 -27 29 17 49 11 33 rrcurveto + 4 14 8 14 4 15 3 2 6 7 11 12 30 36 19 36 8 36 13 61 -3 63 -19 44 -11 27 rcurveline + endchar + + + 80 314 -97 rmoveto + 40 6 21 33 17 29 18 31 6 45 8 41 -10 -13 -9 -14 -12 -10 -17 -14 -41 -12 -19 21 -27 29 17 48 11 33 4 14 8 15 4 15 36 34 32 52 9 43 rrcurveto + 13 61 -3 63 -19 44 -11 26 rcurveline + -77 -113 10 -29 23 -58 -2 -34 rlinecurve + -31 -14 -32 -9 -31 -7 -31 -7 -30 -9 -27 -12 -49 -21 -33 -30 -16 -36 -16 -36 -21 -48 -27 -59 21 -1 rcurveline + 22 52 34 30 48 23 62 18 76 21 45 35 -2 -5 -2 -3 -1 -2 -15 -29 -14 -34 -14 -40 -14 -40 -1 -40 15 -41 8 -21 15 -25 31 4 rrcurveto + endchar + + + 325 496 304 rmoveto + -38 -16 -60 -18 -46 -11 -71 -15 -87 -23 -60 -31 -72 -36 -31 -42 -31 -82 42 -30 rcurveline + 2 2 3 2 5 3 46 33 33 23 20 11 20 11 19 9 20 6 41 13 62 16 54 20 53 19 23 10 33 29 rrcurveto + -20 4 -18 6 -17 vhcurveto + 8 -22 14 -25 32 5 40 5 21 34 17 29 18 31 6 46 8 41 -19 -25 -12 -21 -38 -7 -27 -5 -16 15 -7 20 41 67 12 61 -17 55 rrcurveto + -26 83 1 0 0 vvcurveto + -77 -114 10 -28 23 -60 -2 -33 rlinecurve + endchar + + + 70 333 231 rmoveto + -3 1 vlineto + -38 -16 -61 -18 -46 -11 -40 -8 -32 -7 -24 -6 -24 -6 -20 -23 -16 -42 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 20 20 25 12 23 4 24 4 30 7 35 9 20 5 40 17 17 9 9 4 10 6 11 8 -5 -10 rcurveline + -15 -29 -14 -34 -14 -40 rrcurveto + -7 -20 -5 -20 -20 vvcurveto + -40 14 -63 44 45 24 39 29 17 vhcurveto + 18 31 7 45 7 41 rrcurveto + -25 -18 -19 -28 -44 hhcurveto + -27 -15 26 25 4 0 5 1 5 hvcurveto + 4 21 5 18 6 17 4 14 8 15 4 15 35 35 33 52 9 43 rrcurveto + 5 26 3 24 22 vvcurveto + 37 -8 36 -9 22 vhcurveto + -12 26 -76 -113 rlineto + 10 -29 20 -54 -35 vvcurveto + endchar + + + 342 550 21 rmoveto + 4 0 4 1 5 vhcurveto + 4 21 5 19 6 17 4 14 9 15 4 15 35 35 32 51 9 43 rrcurveto + 5 26 3 24 22 vvcurveto + 37 -8 36 -9 22 vhcurveto + -11 27 -77 -113 rlineto + 10 -29 21 -56 -34 vvcurveto + -2 vlineto + -28 -88 -176 -62 -120 hhcurveto + -48 -37 10 21 -27 hvcurveto + -15 11 -7 17 22 vvcurveto + 28 12 38 23 46 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -24 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -21 -20 vvcurveto + -56 21 -25 57 -8 vhcurveto + -3 18 20 0 21 hhcurveto + 130 180 53 42 79 hvcurveto + 9 4 11 7 11 8 -1 -2 -2 -3 -2 -5 -15 -29 -15 -34 -14 -40 rrcurveto + -7 -20 -4 -20 -20 vvcurveto + -21 4 -19 7 -21 vhcurveto + -19 7 13 -24 26 hhcurveto + 45 24 40 29 17 hvcurveto + 18 31 6 45 8 40 rrcurveto + -24 -19 -16 -28 -45 hhcurveto + -27 -16 26 25 hvcurveto + endchar + + + 102 365 270 rmoveto + 1 vlineto + -52 -23 -69 -15 -57 -17 -49 -15 -37 -23 -24 -29 -24 -29 -26 -43 -27 -59 rrcurveto + -1 vlineto + 17 -16 24 37 32 26 39 14 rlinecurve + 39 14 40 13 42 13 42 13 22 6 32 24 -17 -34 -16 -35 -16 -45 -15 -40 0 -40 15 -41 8 -22 16 -24 31 4 40 6 21 34 17 28 18 32 6 44 8 41 rrcurveto + -10 -13 -9 -13 -12 -10 -16 -14 -43 -13 -18 21 -14 15 -4 18 4 21 4 21 4 19 6 17 5 14 8 15 4 15 36 33 32 54 9 42 13 61 -3 62 -19 44 -11 26 rcurveline + -77 -112 10 -29 22 -60 -1 -33 rlinecurve + endchar + + + 67 84 254 rmoveto + 39 46 6 12 25 hvcurveto + 34 16 29 38 30 41 28 39 26 32 -2 19 -5 51 -72 -16 -26 46 28 24 23 8 38 10 8 15 25 30 10 17 rrcurveto + 17 10 12 23 -14 hhcurveto + -14 -35 -20 -11 -15 hvcurveto + -91 -63 -91 -118 26 -45 11 -19 27 -19 35 -8 17 -4 11 -10 -24 -12 -48 -24 -80 -28 -44 -28 rrcurveto + -16 -25 18 -3 30 hhcurveto + endchar + + + -192 297 276 rmoveto + -235 hlineto + -7 -40 rlineto + 236 hlineto + endchar + + + -222 206 625 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -14 -233 rmoveto + 44 -17 35 -45 -39 -56 -39 -36 -45 vhcurveto + 13 -18 rlineto + 15 24 34 17 22 hhcurveto + 26 9 -33 -52 hvcurveto + -6 -221 rlineto + -99 37 -13 43 55 52 52 45 34 vhcurveto + 11 vlineto + -13 10 rlineto + -24 -27 -27 -21 -38 hhcurveto + -35 -9 43 74 hvcurveto + endchar + + + -287 279 707 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 75 -161 rmoveto + 44 -17 35 -45 -39 -56 -39 -36 -45 vhcurveto + 13 -18 rlineto + 15 24 34 17 22 hhcurveto + 26 9 -33 -52 hvcurveto + -6 -221 rlineto + -99 37 -13 43 55 52 52 45 34 vhcurveto + 11 vlineto + -13 10 rlineto + -24 -27 -27 -21 -38 hhcurveto + -35 -9 43 74 hvcurveto + endchar + + + -287 -51 562 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + 74 -351 rmoveto + 44 -17 35 -45 -39 -56 -39 -36 -45 vhcurveto + 13 -18 rlineto + 15 24 34 17 22 hhcurveto + 26 9 -33 -52 hvcurveto + -6 -221 rlineto + -99 37 -13 43 55 52 52 45 34 vhcurveto + 11 vlineto + -13 10 rlineto + -24 -27 -27 -21 -38 hhcurveto + -35 -9 43 74 hvcurveto + endchar + + + -287 272 607 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 122 -215 rmoveto + 44 -17 35 -45 -39 -56 -39 -36 -45 vhcurveto + 13 -18 rlineto + 15 24 34 17 22 hhcurveto + 26 9 -33 -52 hvcurveto + -6 -221 rlineto + -99 37 -13 43 55 52 52 45 34 vhcurveto + 11 vlineto + -13 10 rlineto + -24 -27 -27 -21 -38 hhcurveto + -35 -9 43 74 hvcurveto + endchar + + + -287 -70 708 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 215 -352 rmoveto + 44 -17 35 -45 -39 -56 -39 -36 -45 vhcurveto + 13 -18 rlineto + 15 24 34 17 22 hhcurveto + 26 9 -33 -52 hvcurveto + -6 -221 rlineto + -99 37 -13 43 55 52 52 45 34 vhcurveto + 11 vlineto + -13 10 rlineto + -24 -27 -27 -21 -38 hhcurveto + -35 -9 43 74 hvcurveto + endchar + + + -267 266 108 rmoveto + -20 -20 -27 -24 -28 hhcurveto + -61 2 86 45 90 2 90 15 89 hvcurveto + -11 10 -81 -25 rlineto + -347 vlineto + -50 29 -61 52 57 55 56 48 38 vhcurveto + -13 14 rlineto + endchar + + + -254 159 683 rmoveto + -32 -27 -26 -32 -32 23 -28 33 35 26 30 34 32 -28 22 -30 hvcurveto + -141 -308 rmoveto + 13 25 35 20 16 hhcurveto + 36 8 -12 -242 -44 -3 -124 -17 -62 hvcurveto + -14 -50 -40 -45 -74 -44 16 -16 rcurveline + 90 43 76 60 30 87 rrcurveto + 12 35 0 140 20 vvcurveto + 37 0 167 -7 43 vhcurveto + 33 -3 -10 34 -48 hhcurveto + -43 -57 -43 -32 -41 hvcurveto + endchar + + + 319 648 -186 rmoveto + 4 4 -12 -3 -5 -1 -175 -46 -260 -39 -136 153 -78 88 247 211 55 48 40 35 43 36 32 46 27 38 64 138 -66 27 -64 27 -108 -20 -44 -31 -66 -47 -39 -153 75 -83 rrcurveto + -90 -82 -118 -209 30 -141 55 -261 426 67 163 198 rrcurveto + -446 594 rmoveto + 29 25 136 24 20 -59 -34 -32 -52 -32 -41 -30 -16 36 -27 30 -15 38 rrcurveto + 259 -371 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + endchar + + + 105 507 531 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + -59 -259 rmoveto + -1 7 -9 1 -3 -8 -16 -35 -23 -28 -30 -20 -64 -43 -79 -27 -81 -25 -236 -73 96 -17 156 -4 101 -3 67 33 45 54 31 37 33 84 13 67 rrcurveto + endchar + + + -29 154 266 rmoveto + 413 vlineto + 3 7 -160 -23 -5 -4 rlineto + -21 vlineto + 53 -6 24 -7 9 -31 rrcurveto + 7 -27 2 -48 -51 vvcurveto + -158 -8 -153 -4 -157 vhcurveto + 6 -7 71 20 rlineto + 221 vlineto + 12 7 rlineto + 71 -79 89 -120 0 vvcurveto + -38 33 16 -11 30 hhcurveto + 53 50 67 32 24 hvcurveto + -19 20 rlineto + -23 -22 -23 -16 -33 hhcurveto + -40 -97 110 75 -59 hvcurveto + -3 5 -5 5 6 vvcurveto + 5 11 9 7 6 vhcurveto + 67 56 71 51 75 44 rrcurveto + 11 vlineto + -46 29 -24 -14 -11 -11 -78 -71 rlinecurve + -134 -123 rlineto + endchar + + + 204 488 217 rmoveto + -89 -47 -202 -79 -94 74 -89 69 68 72 46 67 48 70 111 66 21 -129 -34 -16 -8 -6 -38 -8 -43 -131 rcurveline + 322 115 -101 533 -312 -487 -49 -77 -70 -115 33 -89 72 -192 329 119 98 150 33 50 31 56 -4 61 -30 387 rcurveline + -73 -122 28 -369 1 -13 1 -5 -6 -4 rlinecurve + endchar + + + 147 309 580 rmoveto + -7 -9 -1 -2 -8 hvcurveto + -49 -9 -64 -66 -78 -121 -25 -38 -24 -46 -24 -52 rrcurveto + -15 -31 -7 -31 -28 vvcurveto + -19 3 -18 7 -18 vhcurveto + -68 25 51 -31 85 hhcurveto + 23 26 3 6 25 hvcurveto + 99 23 108 69 49 73 12 -175 rcurveline + 70 110 -41 620 -74 -122 32 -381 -22 -12 -29 -13 -35 -15 rlinecurve + -25 -60 -78 -25 -79 hhcurveto + -4 hlineto + -36 -29 10 19 -23 hvcurveto + -31 24 -16 24 24 vvcurveto + 11 2 11 6 11 vhcurveto + 19 35 22 34 23 34 24 35 33 26 43 17 rrcurveto + 4 9 8 1 7 hhcurveto + 28 20 -25 -51 8 hvcurveto + -36 -17 -3 -4 -41 -9 -43 -131 rcurveline + 80 29 55 47 30 66 rrcurveto + 21 47 10 40 36 vvcurveto + 56 -24 39 -49 vhcurveto + endchar + + + 561 906 233 rmoveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -157 -2 -121 36 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 17 61 58 75 43 90 28 90 28 86 14 82 3 53 113 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -115 -58 -79 -102 -79 -101 -26 -122 92 -100 64 -69 147 -32 162 4 129 3 121 26 98 42 55 23 44 32 35 40 12 -168 rcurveline + 72 110 -17 243 rlineto + 6 0 9 -1 12 vhcurveto + -20 405 -74 -117 5 -85 14 -260 1 -90 rlinecurve + -468 -30 rmoveto + 29 35 5 9 19 hvcurveto + 25 12 22 28 22 31 21 29 20 24 -2 14 -3 39 -54 -12 -20 34 21 18 17 6 29 8 6 11 19 22 7 13 rrcurveto + 13 8 9 17 -11 hhcurveto + -10 -27 -15 -8 -11 hvcurveto + -68 -47 -68 -89 19 -34 8 -14 21 -14 26 -6 13 -3 8 -8 -18 -9 -36 -18 -60 -21 -33 -21 rrcurveto + -12 -19 14 -2 22 hhcurveto + endchar + + + 134 244 182 rmoveto + -32 -16 -37 -11 -41 -8 -41 -8 -37 -6 -34 -5 -22 -128 rcurveline + 70 17 64 19 57 23 57 23 38 54 21 85 rrcurveto + 7 24 5 33 33 vvcurveto + 18 vlineto + -16 256 106 62 106 62 106 62 rlinecurve + 33 117 rlineto + 4 vlineto + 4 -1 1 -3 -2 -2 0 -2 -3 vhcurveto + -19 -11 -241 -141 -63 -37 -32 -117 rcurveline + -61 -95 rlineto + 6 -97 11 -113 -102 vvcurveto + endchar + + + 221 356 181 rmoveto + -13 -6 -22 -8 -32 -10 -62 -19 -165 -42 -23 80 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -3 78 -8 79 17 78 41 67 36 43 56 19 76 8 29 5 40 -2 39 -16 256 rcurveline + 80 46 -1 1 80 46 53 31 54 32 53 31 32 116 rcurveline + 1 9 -4 3 -8 -5 -108 -63 -107 -63 -108 -63 -32 -117 rcurveline + -60 -95 rlineto + 6 -98 10 -112 -102 vvcurveto + endchar + + + 202 226 450 rmoveto + 109 64 88 47 109 64 33 117 rcurveline + 1 9 -4 3 -8 -5 -110 -64 -86 -48 -110 -64 -33 -116 rcurveline + -2 -9 4 -3 9 5 rrcurveto + -35 -388 rmoveto + 41 29 35 48 29 64 rrcurveto + 16 35 8 36 37 vvcurveto + 37 -14 35 -30 31 vhcurveto + -68 68 -79 -82 -37 -50 -17 -22 -13 -20 -10 -15 3 -45 rcurveline + 34 53 40 14 45 -25 45 -25 21 -39 -3 -54 -52 -24 -58 -14 -65 -6 -62 -122 rcurveline + -5 3 -1 5 vhcurveto + 1 3 3 0 3 hhcurveto + 71 8 61 23 42 30 rrcurveto + endchar + + + -31 35 274 rmoveto + 2 -39 48 71 46 21 43 -30 rlinecurve + 43 -30 20 -41 -3 -54 -52 -24 -58 -14 -65 -6 -62 -122 rcurveline + -5 3 -1 5 vhcurveto + 6 1 6 1 5 1 148 22 68 56 55 122 rrcurveto + 16 35 8 36 37 vvcurveto + 37 -14 35 -30 31 vhcurveto + -23 23 -25 10 -25 -5 21 31 19 30 18 31 33 57 43 88 -23 65 -23 64 -67 36 -81 -38 -37 -18 -32 -29 -26 -42 -26 -42 -15 -28 -4 -15 -1 -4 2 -3 5 -4 rrcurveto + 5 -4 6 3 7 11 12 16 25 18 40 19 76 36 56 -23 3 -78 1 -38 -6 -31 -14 -25 -14 -24 -22 -44 -23 -14 -29 -19 -27 -26 -25 -35 -25 -35 -14 -30 -3 -24 rrcurveto + endchar + + + 155 224 49 rmoveto + 102 54 46 110 -7 112 -16 257 rcurveline + 106 62 107 62 106 62 32 117 rcurveline + 1 6 -6 3 -5 -2 -108 -63 -108 -63 -108 -63 -32 -117 rcurveline + -60 -96 rlineto + 7 -100 10 -110 -102 vvcurveto + -39 -17 -226 -90 22 127 rrcurveto + 3 -3 1 -3 -4 vhcurveto + -40 -58 -30 -102 65 -32 48 -23 109 50 30 16 rrcurveto + endchar + + + 306 441 183 rmoveto + -66 -29 -96 -17 -85 -6 -65 -5 -77 3 -13 47 -13 -35 -13 -42 -13 -50 1 -29 27 -15 28 -2 46 -5 54 2 62 8 148 19 106 64 32 130 8 30 6 39 -2 40 -16 256 rcurveline + 80 46 -1 1 80 46 53 31 53 31 53 31 33 117 rcurveline + 1 9 -4 2 -8 -4 -108 -63 -107 -63 -108 -63 -33 -117 rcurveline + -60 -95 rlineto + 6 -98 11 -112 -102 vvcurveto + endchar + + + -35 101 88 rmoveto + -1 vlineto + -1 -3 -15 -8 -29 -13 -29 -13 -16 -7 -4 -1 -7 -17 rcurveline + 98 -25 27 35 28 40 12 48 rlinecurve + 4 14 2 16 3 19 rrcurveto + 1 12 1 13 13 vvcurveto + 21 vlineto + -16 257 106 63 106 61 107 62 rlinecurve + 32 117 rlineto + 3 vlineto + 4 -1 1 -3 -2 -2 -1 -1 -3 vhcurveto + -107 -63 -109 -63 -107 -63 -32 -116 rcurveline + -61 -96 rlineto + 6 -96 11 -110 -102 vvcurveto + endchar + + + 212 346 234 rmoveto + -82 -35 -57 -46 -34 -55 -34 -55 -37 -68 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 26 52 22 55 23 54 22 52 29 48 35 43 13 15 19 13 25 11 78 33 52 58 22 86 8 30 5 39 -2 39 -16 257 rcurveline + 106 62 107 63 106 62 32 116 rcurveline + 2 9 -4 3 -9 -5 -108 -63 -107 -63 -108 -63 -32 -117 rcurveline + -60 -96 rlineto + 6 -97 10 -112 -102 vvcurveto + endchar + + + -273 17 hmoveto + 74 100 1 12 0 12 -1 14 rlinecurve + -16 257 80 46 -1 1 80 46 rlinecurve + 53 31 54 31 53 31 32 117 rcurveline + 1 9 -3 2 -8 -4 -107 -63 -110 -63 -107 -63 -32 -117 rcurveline + -60 -96 6 -96 10 -108 1 -99 rlinecurve + endchar + + + 314 50 4 rmoveto + 26 18 25 16 26 16 40 24 38 23 33 33 10 9 6 8 2 4 38 57 27 61 -6 89 -16 257 rcurveline + 106 62 107 62 105 62 33 117 rcurveline + 2 9 -4 3 -9 -5 -107 -63 -109 -63 -107 -63 -33 -116 rcurveline + -60 -96 rlineto + 7 -96 10 -111 -102 vvcurveto + -2 -11 -6 -21 -11 vhcurveto + -48 -25 -43 -17 -39 -31 -32 -25 -30 -29 -16 -41 46 -33 rcurveline + 0 4 4 1 vvcurveto + endchar + + + 149 284 226 rmoveto + -2 -1 -2 0 -2 -1 -7 -3 -8 -2 -8 -2 -59 -13 -67 -19 -28 -10 -28 -10 -21 -17 -14 -23 -9 -16 -8 -22 -7 -32 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 11 17 64 64 127 2 60 67 rrcurveto + 0 2 3 7 8 vhcurveto + 1 vlineto + 13 14 10 17 9 19 21 47 15 50 -4 68 -16 256 rcurveline + 106 62 107 63 106 62 32 117 rcurveline + 2 9 -4 2 -9 -5 -107 -62 -109 -65 -107 -62 -32 -116 rcurveline + -60 -96 6 -98 10 -111 1 -103 rlinecurve + endchar + + + 370 507 193 rmoveto + -13 -12 -37 -15 -59 -21 rrcurveto + -22 -64 -60 -14 -65 hhcurveto + -51 -40 14 26 -28 hvcurveto + -13 12 -6 17 22 vvcurveto + 31 13 41 26 51 vhcurveto + 1 2 0 1 1 vvcurveto + 1 -1 1 -1 1 vhcurveto + -3 hlineto + -2 -1 0 -2 -1 hvcurveto + -10 -15 -15 -24 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -21 -20 vvcurveto + -55 21 -25 57 -8 vhcurveto + -3 23 24 -2 26 hhcurveto + 83 68 13 25 66 hvcurveto + 92 35 84 64 25 100 rrcurveto + 7 24 5 34 33 vvcurveto + 17 vlineto + -17 257 106 62 107 62 106 62 rlinecurve + 33 117 rlineto + 3 vlineto + 4 -2 1 -3 -2 -1 0 -1 -3 vhcurveto + -108 -64 -107 -63 -108 -63 -33 -116 rcurveline + -60 -96 rlineto + 6 -98 11 -111 -103 vvcurveto + endchar + + + 147 101 88 rmoveto + -1 vlineto + -1 -3 -15 -8 -29 -13 -29 -13 -16 -7 -4 -1 -7 -17 rcurveline + 98 -25 27 35 28 40 12 48 rlinecurve + 4 14 2 16 3 19 rrcurveto + 1 12 1 13 13 vvcurveto + 21 vlineto + -16 257 106 63 106 61 107 62 rlinecurve + 32 117 rlineto + 3 vlineto + 4 -1 1 -3 -2 -2 -1 -1 -3 vhcurveto + -107 -63 -109 -63 -107 -63 -32 -116 rcurveline + -61 -96 rlineto + 6 -96 11 -110 -102 vvcurveto + endchar + + + 666 906 232 rmoveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -158 -2 -120 35 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 43 90 28 90 28 86 14 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 47 -6 58 -1 71 3 156 6 142 43 101 68 56 38 35 51 16 63 rrcurveto + 8 29 5 40 -2 39 -20 405 rcurveline + -74 -117 5 -85 14 -261 1 -89 rlinecurve + -468 -29 rmoveto + 29 35 5 9 19 hvcurveto + 25 12 22 28 22 31 21 29 20 24 -2 14 -3 39 -54 -12 -20 34 21 18 17 6 29 8 6 11 19 22 7 13 rrcurveto + 13 8 9 17 -11 hhcurveto + -10 -27 -15 -8 -11 hvcurveto + -68 -47 -68 -89 19 -34 8 -14 21 -14 26 -6 13 -3 8 -8 -18 -9 -36 -18 -60 -21 -33 -21 rrcurveto + -12 -19 14 -2 22 hhcurveto + endchar + + + -105 214 501 rmoveto + 32 -324 -32 -17 -75 -16 -117 -16 rlinecurve + -22 -128 55 12 47 11 38 10 rlinecurve + 38 10 37 30 35 52 9 -125 rcurveline + 71 113 -38 461 105 61 84 46 105 61 rlinecurve + 33 117 rlineto + 1 1 2 1 vvcurveto + 3 -1 2 -3 -2 -3 -1 -2 -3 vhcurveto + -110 -64 -86 -47 -110 -64 -23 -81 rcurveline + endchar + + + 76 396 501 rmoveto + 31 -324 -31 -16 -45 -13 -60 -9 rlinecurve + -60 -9 -49 -5 -35 1 -49 1 -48 9 -11 37 -13 -34 -13 -42 -13 -51 1 -29 27 -14 28 -3 45 -4 57 3 66 11 46 8 38 9 31 12 31 12 31 29 31 45 9 -125 rcurveline + 71 109 -38 465 105 61 85 45 105 62 rlinecurve + 32 117 1 8 -4 2 -8 -4 rlinecurve + -110 -64 -86 -47 -110 -64 -23 -82 rcurveline + endchar + + + -78 241 501 rmoveto + 31 -324 -40 -20 -213 -81 31 132 rlinecurve + 1 0 1 -2 -2 vhcurveto + -43 -56 -35 -111 68 -33 63 -31 136 90 39 57 10 -124 rcurveline + 72 106 -39 468 103 60 88 47 104 61 rlinecurve + 32 117 1 6 -7 3 -5 -2 rlinecurve + -108 -63 -90 -50 -108 -63 -23 -81 rcurveline + endchar + + + 99 419 511 rmoveto + 31 -324 -30 -15 -43 -13 -54 -10 rlinecurve + -54 -10 -43 -6 -32 -2 -65 -5 -77 4 -13 47 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 65 -7 74 7 80 18 80 18 60 38 39 57 10 -125 rcurveline + 69 138 -36 436 105 61 84 46 105 61 rlinecurve + 33 117 1 9 -4 3 -8 -5 rlinecurve + -110 -64 -87 -48 -110 -64 -22 -81 rcurveline + endchar + + + -6 327 358 rmoveto + 11 -129 2 -18 19 -211 73 102 rcurveline + -40 472 105 61 84 46 105 61 rlinecurve + 33 117 2 9 -4 2 -9 -5 rlinecurve + -110 -64 -87 -47 -110 -64 -22 -81 rcurveline + -65 -108 5 -54 -50 -17 -58 -27 -67 -39 rlinecurve + -67 -39 -48 -74 -29 -109 23 -5 rcurveline + 71 99 112 81 121 41 rrcurveto + endchar + + + 118 438 500 rmoveto + 15 -167 -48 -12 -49 -26 -50 -42 rlinecurve + -50 -42 -37 -35 -23 -31 -52 -67 -42 -79 -39 -78 -1 -3 rcurveline + -8 -15 4 29 rlineto + 2 vlineto + -53 -66 -3 -39 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 12 19 40 29 58 23 55 15 36 15 36 27 42 40 47 17 21 18 18 18 19 45 47 20 9 64 45 34 24 28 10 24 -6 22 -237 rcurveline + 71 111 -38 462 104 61 85 47 105 61 rlinecurve + 32 116 1 9 -3 3 -8 -5 rlinecurve + -110 -64 -87 -48 -110 -64 -22 -81 rcurveline + endchar + + + -22 328 190 rmoveto + -29 -14 -101 -21 -174 -30 -24 -126 rcurveline + 129 26 76 16 26 7 33 9 33 29 35 49 1 -11 rcurveline + 1 vlineto + 10 -125 73 97 -30 416 105 61 86 46 105 62 rlinecurve + 32 117 1 9 -3 3 -8 -5 rlinecurve + -110 -64 -87 -48 -110 -64 -25 -92 rcurveline + -62 -103 1 -9 rlineto + endchar + + + -44 276 501 rmoveto + 4 -52 -69 -35 -58 -35 -46 -37 rlinecurve + -46 -37 -35 -57 -24 -77 rrcurveto + -11 -3 0 -6 5 hhcurveto + 5 4 2 5 3 hvcurveto + 38 60 35 39 32 19 32 19 57 24 80 27 31 -349 rcurveline + 72 108 -39 466 104 61 86 46 104 61 rlinecurve + 32 117 2 9 -3 2 -9 -5 rlinecurve + -110 -64 -87 -47 -110 -64 -22 -81 rcurveline + endchar + + + -114 50 6 rmoveto + 21 15 26 16 30 19 40 24 38 23 32 33 3 3 4 3 4 5 2 -30 rcurveline + 69 138 -21 366 107 62 106 61 106 63 rlinecurve + 32 117 2 9 -4 2 -8 -5 rlinecurve + -107 -63 -109 -64 -108 -62 -32 -116 rcurveline + -60 -96 17 -308 rlineto + -1 vlineto + -1 -3 -10 -5 -21 -10 -28 -16 -44 -17 -25 -16 -43 -28 -48 -40 -20 -51 46 -34 rcurveline + 1 2 1 2 2 2 rrcurveto + endchar + + + -52 11 76 rmoveto + 6 5 5 9 7 hvcurveto + 12 12 25 10 37 10 rrcurveto + 1 vlineto + 42 9 39 11 36 14 32 12 23 22 17 33 20 -224 rcurveline + 71 106 -38 468 105 61 84 46 105 61 rlinecurve + 33 117 rlineto + 3 vlineto + 4 -1 2 -3 -2 -2 0 -2 -3 vhcurveto + -110 -64 -87 -48 -110 -64 -22 -81 rcurveline + -65 -108 19 -213 -86 -19 -57 -13 -28 -9 rlinecurve + -14 -5 -15 -9 -14 -11 -21 -17 -27 -39 -15 -34 rrcurveto + -1 vlineto + -10 -12 -5 -10 -9 vvcurveto + -10 8 -14 9 vhcurveto + endchar + + + 210 106 382 rmoveto + -2 -1 -1 -2 -1 hvcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -21 -20 vvcurveto + -56 21 -25 57 -8 vhcurveto + -3 21 24 -2 26 hhcurveto + 15 16 1 1 17 hvcurveto + 46 3 46 7 46 11 88 21 89 39 46 61 15 -190 rcurveline + 72 109 -37 465 295 168 32 117 rlineto + 1 1 1 1 vvcurveto + 4 -2 1 -3 -2 -2 -1 -1 -3 vhcurveto + -110 -64 -86 -47 -110 -64 -23 -81 rcurveline + -64 -108 23 -252 -29 -14 -47 -16 -65 -18 rlinecurve + -18 -65 -62 -10 -58 hhcurveto + -1 hlineto + -57 -44 14 28 -30 hvcurveto + -13 12 -7 17 22 vvcurveto + 28 11 37 22 44 vhcurveto + 1 2 0 0 1 vvcurveto + 3 -3 1 -2 vhcurveto + endchar + + + -44 276 501 rmoveto + 4 -52 -69 -35 -58 -35 -46 -37 rlinecurve + -46 -37 -35 -57 -24 -77 rrcurveto + -11 -3 0 -6 5 hhcurveto + 5 4 2 5 3 hvcurveto + 38 60 35 39 32 19 32 19 57 24 80 27 31 -349 rcurveline + 72 105 -39 469 104 61 86 46 104 61 rlinecurve + 32 117 2 9 -3 2 -9 -5 rlinecurve + -110 -64 -87 -47 -110 -64 -22 -81 rcurveline + endchar + + + 204 387 782 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + 101 -565 rmoveto + -89 -47 -202 -79 -94 74 -89 69 68 72 46 67 48 70 111 66 21 -129 -34 -16 -8 -6 -38 -8 -43 -131 rcurveline + 322 115 -101 533 -312 -487 -49 -77 -70 -115 33 -89 72 -192 329 119 98 150 33 50 31 56 -4 61 -30 387 rcurveline + -73 -122 28 -369 1 -13 1 -5 -6 -4 rlinecurve + endchar + + + -86 399 472 rmoveto + -94 -60 -88 -68 -76 -82 -6 2 rcurveline + 1 31 4 106 2 58 -5 6 rcurveline + -79 -26 rlineto + 3 -83 1 -82 -83 vvcurveto + -63 0 -64 -1 -63 vhcurveto + 16 -5 63 26 rlineto + -3 63 -3 66 61 vvcurveto + 9 4 76 -70 90 -76 85 -72 rlinecurve + 67 36 1 14 -89 64 -86 68 -80 75 rlinecurve + -4 11 rlineto + 2 0 2 1 2 vhcurveto + 43 51 113 65 89 38 1 15 rcurveline + endchar + + + endchar + + + 79 76 rmoveto + 29 46 -67 -24 -76 -26 -64 -26 rlinecurve + -33 -52 61 30 81 28 69 24 rlinecurve + endchar + + + 79 75 rmoveto + 29 46 -67 -24 -76 -26 -64 -26 rlinecurve + -33 -52 61 30 81 28 69 24 rlinecurve + -65 vmoveto + 29 46 -67 -24 -76 -26 -64 -26 rlinecurve + -33 -52 61 30 81 28 69 24 rlinecurve + endchar + + + 580 487 148 rmoveto + 40 48 31 79 0 vvcurveto + 8 28 0 14 -3 42 -16 257 rcurveline + 106 62 107 63 106 62 33 117 rcurveline + 1 6 -7 2 -5 -2 -108 -63 -108 -63 -108 -63 -32 -117 rcurveline + -60 -95 rlineto + 7 -100 12 -101 -102 vvcurveto + -182 -92 -155 -29 -72 84 -47 54 30 58 46 83 -11 -3 -11 -8 -5 -8 -75 -115 -15 -81 11 -52 13 -59 43 -44 81 -8 130 -13 145 75 70 84 rrcurveto + endchar + + + 147 581 138 rmoveto + -11 158 -10 162 -10 158 106 62 107 62 106 62 33 117 rcurveline + 1 6 -7 2 -5 -2 -108 -63 -108 -63 -108 -63 -32 -116 rcurveline + -60 -96 7 -100 6 -96 6 -102 rlinecurve + -52 -33 -386 -170 6 230 1 53 27 42 20 36 -11 -3 -7 -5 -5 -8 -129 -198 39 -86 52 -46 114 -101 257 119 80 118 11 -174 rcurveline + endchar + + + 562 905 292 rmoveto + -20 1 -21 -18 vvcurveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -157 -2 -121 36 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 17 61 58 75 43 90 28 90 28 86 14 82 3 53 113 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -115 -58 -79 -102 -79 -101 -26 -122 92 -100 64 -69 147 -32 162 4 129 3 121 26 98 42 55 23 44 31 35 40 11 -167 rcurveline + 73 110 -17 241 rlineto + 10 0 10 -1 8 vhcurveto + -15 257 106 62 106 62 106 62 rlinecurve + 33 116 1 9 -4 3 -8 -5 rlinecurve + -108 -63 -107 -63 -108 -63 -33 -116 rcurveline + -60 -96 5 -82 8 -86 3 -84 rlinecurve + endchar + + + 1019 905 290 rmoveto + -20 1 -19 -19 vvcurveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -158 -2 -120 35 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 43 90 28 90 28 86 14 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 47 -6 58 -1 71 3 156 6 142 43 101 68 56 38 35 51 16 63 rrcurveto + 7 25 4 26 1 27 rrcurveto + 10 0 10 -1 9 vhcurveto + -15 256 106 62 106 63 106 62 rlinecurve + 33 117 1 8 -4 2 -8 -4 rlinecurve + -108 -64 -107 -62 -108 -63 -33 -116 rcurveline + -60 -96 5 -81 8 -89 3 -83 rlinecurve + endchar + + + 580 773 927 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -286 -779 rmoveto + 40 48 31 79 0 vvcurveto + 8 28 0 14 -3 42 -16 257 rcurveline + 106 62 107 63 106 62 33 117 rcurveline + 1 6 -7 2 -5 -2 -108 -63 -108 -63 -108 -63 -32 -117 rcurveline + -60 -95 rlineto + 7 -100 12 -101 -102 vvcurveto + -182 -92 -155 -29 -72 84 -47 54 30 58 46 83 -11 -3 -11 -8 -5 -8 -75 -115 -15 -81 11 -52 13 -59 43 -44 81 -8 130 -13 145 75 70 84 rrcurveto + endchar + + + 319 387 752 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + 261 -938 rmoveto + 4 4 -12 -3 -5 -1 -175 -46 -260 -39 -136 153 -78 88 247 211 55 48 40 35 43 36 32 46 27 38 64 138 -66 27 -64 27 -108 -20 -44 -31 -66 -47 -39 -153 75 -83 rrcurveto + -90 -82 -118 -209 30 -141 55 -261 426 67 163 198 rrcurveto + -446 594 rmoveto + 29 25 136 24 20 -59 -34 -32 -52 -32 -41 -30 -16 36 -27 30 -15 38 rrcurveto + endchar + + + -244 289 112 rmoveto + -22 -25 -28 -25 -33 hhcurveto + -60 4 12 91 99 vvcurveto + 140 10 140 4 140 vhcurveto + -6 7 -165 -20 -6 -5 rlineto + -23 vlineto + 32 -2 48 3 7 -31 rrcurveto + 5 -24 0 -43 -33 vvcurveto + -7 -378 rlineto + -115 31 -26 51 66 52 58 53 34 vhcurveto + -11 12 rlineto + endchar + + + 81 328 666 rmoveto + 28 -443 -64 -54 -95 -40 -111 20 rlinecurve + -107 46 88 134 31 69 9 24 -12 3 -8 -16 -256 -466 372 -28 146 211 rrcurveto + 49 71 30 84 85 vvcurveto + 0 -21 340 -5 78 vhcurveto + endchar + + + 64 328 666 rmoveto + 28 -443 -64 -54 -95 -40 -111 20 rlinecurve + -107 46 88 134 31 69 9 24 -12 3 -8 -16 -256 -466 372 -28 146 211 rrcurveto + 49 71 30 84 85 vvcurveto + 0 -21 340 -5 78 vhcurveto + endchar + + + 666 906 232 rmoveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -158 -2 -120 35 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 43 90 28 90 28 86 14 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 47 -6 58 -1 71 3 156 6 142 43 101 68 56 38 35 51 16 63 rrcurveto + 8 29 5 40 -2 39 -20 405 rcurveline + -74 -117 5 -85 14 -261 1 -89 rlinecurve + endchar + + + -31 243 182 rmoveto + -30 -13 -30 -10 -29 -7 -29 -7 -44 -7 -58 -9 -22 -125 rcurveline + -1 -4 94 23 59 18 23 12 rlinecurve + 68 36 43 56 19 76 8 29 5 40 -2 39 -18 333 rcurveline + -74 -118 8 -146 9 -83 1 -133 rlinecurve + endchar + + + 90 356 181 rmoveto + -13 -6 -22 -8 -32 -10 -63 -19 -165 -40 -22 78 -13 -35 -13 -43 -13 -50 1 -29 27 -15 28 -2 78 -8 79 17 78 41 67 35 42 57 19 76 9 35 5 36 -2 37 -19 338 rcurveline + -74 -118 rlineto + 6 -92 12 -178 -97 vvcurveto + endchar + + + 310 627 600 rmoveto + -18 -42 -21 -38 -19 -41 10 -56 9 -61 8 -58 rrcurveto + -4 -5 -6 -9 -8 vhcurveto + -29 -25 -33 -22 -35 -19 -43 -23 -43 -18 -45 -22 -215 -94 rcurveline + -43 -17 -50 -17 -41 -19 rrcurveto + -3 -3 -2 -2 -2 vvcurveto + -2 3 -1 7 vhcurveto + 13 15 2 6 hhcurveto + 117 2 119 5 86 33 157 59 129 142 6 202 -7 55 -12 50 -12 50 rrcurveto + endchar + + + -13 321 205 rmoveto + 8 28 5 38 -2 42 -17 348 rcurveline + -74 -118 rlineto + 7 -100 10 -175 -102 vvcurveto + -45 -19 -76 -27 -53 13 rrcurveto + -23 6 -12 26 27 vvcurveto + -1 5 -5 3 -6 -8 -38 -59 -24 -95 63 -31 45 -22 72 33 36 19 66 35 45 55 19 78 rrcurveto + endchar + + + 198 521 230 rmoveto + 10 35 4 37 -2 39 -22 323 rcurveline + -75 -121 4 -68 4 22 4 -83 rlinecurve + 3 -70 5 -88 -66 vvcurveto + -67 -29 -102 -20 -87 -6 -67 -5 -78 4 -14 48 -14 -36 -14 -44 -13 -52 1 -30 28 -14 29 -3 47 -5 55 2 64 8 153 20 110 67 34 135 rrcurveto + endchar + + + -188 91 77 rmoveto + -22 -13 -37 -14 -25 -8 -7 -17 rcurveline + 98 -25 27 36 19 38 10 40 rlinecurve + 9 35 5 36 -2 37 -17 290 rcurveline + -74 -117 6 -97 9 -119 1 -102 rlinecurve + endchar + + + 79 346 234 rmoveto + -82 -35 -57 -46 -34 -55 -34 -55 -37 -68 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 26 52 22 55 23 54 22 52 29 48 35 43 13 15 19 13 25 11 78 33 52 58 22 86 8 30 5 39 -2 39 -15 288 rcurveline + -25 -41 -26 -41 -25 -41 rrcurveto + 6 -97 10 -112 -102 vvcurveto + endchar + + + 7 280 188 rmoveto + -30 -13 -29 -9 -29 -7 -29 -7 -61 -11 -92 -16 -10 -125 rcurveline + 119 28 72 20 23 12 68 36 42 56 19 76 8 29 5 39 -2 39 -12 212 rcurveline + -73 -108 5 -79 5 -90 1 -82 rlinecurve + endchar + + + -230 21 hmoveto + 75 100 1 17 0 12 -1 9 rlinecurve + -21 337 -75 -121 rlineto + endchar + + + 314 267 232 rmoveto + 0 0 0 -44 -22 vhcurveto + -29 -15 -25 -12 -18 -9 -28 -13 -30 -19 -30 -26 -31 -27 -21 -28 -11 -29 45 -33 rcurveline + 1 1 3 3 1 1 18 12 23 15 29 19 47 28 61 32 35 37 11 12 7 7 1 3 16 24 25 44 7 32 10 35 4 36 -2 37 -21 405 rcurveline + -74 -117 rlineto + 6 -84 14 -258 -91 vvcurveto + endchar + + + 14 285 227 rmoveto + -8 -4 -9 -3 -9 -2 -58 -14 -71 -19 -29 -10 -28 -10 -21 -17 -14 -23 -9 -16 -8 -22 -7 -32 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 11 17 18 18 26 15 29 13 37 16 40 10 36 16 67 30 43 61 18 73 8 29 5 41 -2 39 -18 281 rcurveline + -73 -116 6 -98 10 -111 1 -103 rlinecurve + endchar + + + 248 507 199 rmoveto + -13 -12 -37 -16 -59 -21 -96 -34 -141 -28 -71 66 -31 29 7 58 44 88 4 7 -9 1 -3 -4 -10 -15 -15 -23 -20 -34 -20 -34 -15 -34 -11 -36 -11 -36 -2 -33 7 -29 rrcurveto + 7 -29 24 -19 43 -6 102 -15 109 19 79 30 92 35 84 63 25 100 9 35 5 37 -2 37 -21 350 rcurveline + -74 -121 rlineto + 6 -90 14 -190 -96 vvcurveto + endchar + + + -181 91 77 rmoveto + -22 -13 -37 -14 -25 -8 -7 -17 rcurveline + 98 -25 27 36 19 38 10 40 rlinecurve + 9 35 5 36 -2 37 -17 290 rcurveline + -74 -117 6 -97 9 -119 1 -102 rlinecurve + endchar + + + 666 906 232 rmoveto + -89 -38 -71 -25 -55 -12 -55 -12 -76 -10 -97 -7 -158 -2 -120 35 -84 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 43 90 28 90 28 86 14 82 3 53 112 rcurveline + -79 -3 -72 -9 -64 -17 -143 -37 -114 -58 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 47 -6 58 -1 71 3 156 6 142 43 101 68 56 38 35 51 16 63 rrcurveto + 8 29 5 40 -2 39 -20 405 rcurveline + -74 -117 5 -85 14 -261 1 -89 rlinecurve + endchar + + + -118 211 482 rmoveto + 22 -305 -32 -17 -71 -16 -108 -15 rlinecurve + -22 -129 56 14 44 11 34 9 rlinecurve + 34 9 34 30 35 52 10 -125 rcurveline + 72 106 -34 498 rlineto + endchar + + + 77 403 486 rmoveto + 25 -309 -32 -16 -45 -13 -60 -9 rlinecurve + -60 -9 -49 -5 -35 1 -49 1 -48 9 -11 37 -13 -35 -13 -42 -13 -50 1 -30 28 -13 27 -3 65 -7 69 4 73 16 73 16 56 37 40 59 10 -125 rcurveline + 71 104 -36 505 rlineto + endchar + + + 368 764 565 rmoveto + -3 -2 0 -1 -2 hvcurveto + -33 -17 -30 -35 -16 -33 -28 -57 -24 -48 -20 -41 -20 -41 -36 -36 -54 -30 -37 -21 -42 -20 -41 -18 -22 -10 rcurveline + -215 -94 -43 -17 -50 -17 -41 -19 rlinecurve + -3 -3 -2 -2 -2 vvcurveto + -2 3 -1 7 vhcurveto + 13 15 2 6 hhcurveto + 117 2 119 5 86 33 78 30 66 47 51 62 32 40 23 39 14 41 14 41 20 41 28 44 rrcurveto + 6 4 3 4 3 hhcurveto + 6 3 -9 -3 hvcurveto + 21 -425 62 93 -15 464 rlineto + 6 -7 2 -8 vhcurveto + endchar + + + -79 250 484 rmoveto + 22 -307 -40 -20 -94 -27 -53 13 rlinecurve + -27 7 -15 37 8 32 rrcurveto + 1 0 0 -1 -1 vhcurveto + -44 -55 -37 -114 69 -34 77 -38 124 92 37 55 10 -125 rcurveline + 71 104 -33 502 rlineto + endchar + + + 98 418 576 rmoveto + 31 -389 -3 -2 -4 -2 -4 -1 rlinecurve + -1 vlineto + -32 -14 -42 -11 -50 -9 -50 -9 -40 -5 -30 -2 -65 -5 -77 4 -13 47 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 62 -6 71 5 76 16 76 16 59 34 42 51 rrcurveto + 5 5 5 7 2 3 9 -125 rcurveline + 69 138 -40 551 rlineto + endchar + + + -9 327 358 rmoveto + 28 -358 72 107 -43 581 -73 -122 9 -118 -50 -18 -59 -27 -67 -39 rlinecurve + -67 -39 -48 -74 -29 -109 23 -5 rcurveline + 71 99 111 81 122 41 rrcurveto + endchar + + + 118 438 500 rmoveto + 15 -167 -48 -12 -49 -26 -50 -42 rlinecurve + -50 -42 -37 -35 -23 -31 -52 -67 -42 -79 -39 -78 -1 -3 rcurveline + -8 -15 4 29 rlineto + 2 vlineto + -53 -66 -3 -39 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 12 19 40 29 58 23 55 15 36 15 36 27 42 40 47 17 21 18 18 18 19 45 47 20 9 64 45 34 24 28 10 24 -6 22 -237 rcurveline + 71 109 -41 516 rlineto + endchar + + + -59 377 109 rmoveto + -31 455 -73 -123 rlineto + -8 vlineto + 19 -249 -32 -17 -90 -18 -148 -20 rlinecurve + -22 -129 95 18 64 14 34 9 rlinecurve + 34 9 34 29 35 52 10 -131 rcurveline + endchar + + + -44 271 580 rmoveto + 9 -131 -69 -35 -58 -35 -46 -37 rlinecurve + -46 -37 -35 -57 -24 -77 rrcurveto + -11 -3 0 -6 5 hhcurveto + 5 4 2 5 3 hvcurveto + 38 60 35 39 32 19 32 19 57 24 80 27 31 -349 rcurveline + 73 101 -50 600 rlineto + endchar + + + -82 51 6 rmoveto + 18 12 23 15 29 19 55 32 67 35 36 48 4 -50 rcurveline + 69 138 -31 529 -73 -117 27 -432 rlineto + 0 0 0 -48 -23 vhcurveto + -71 -34 -37 -13 -56 -48 -31 -27 -21 -28 -11 -28 46 -34 rcurveline + 1 1 3 4 1 1 rrcurveto + endchar + + + -52 11 76 rmoveto + 6 5 5 9 7 hvcurveto + 12 12 25 10 37 10 rrcurveto + 1 vlineto + 42 9 39 11 36 14 32 12 23 22 17 33 20 -224 rcurveline + 72 108 -43 516 -74 -123 19 -213 -86 -19 -57 -13 -28 -9 rlinecurve + -14 -5 -15 -9 -14 -11 -21 -17 -27 -39 -15 -34 rrcurveto + -1 vlineto + -10 -12 -5 -10 -9 vvcurveto + -10 8 -14 9 vhcurveto + endchar + + + 210 106 382 rmoveto + -2 -1 -1 -2 -1 hvcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -21 -20 vvcurveto + -56 21 -25 57 -8 vhcurveto + -3 21 24 -2 26 hhcurveto + 15 16 1 1 17 hvcurveto + 46 3 46 7 46 11 88 21 89 39 46 61 15 -190 rcurveline + 72 106 -38 536 -74 -122 21 -271 -29 -14 -47 -16 -65 -18 rlinecurve + -18 -65 -62 -10 -58 hhcurveto + -1 hlineto + -57 -44 14 28 -30 hvcurveto + -13 12 -7 17 22 vvcurveto + 28 11 37 22 44 vhcurveto + 1 2 0 0 1 vvcurveto + 3 -3 1 -2 vhcurveto + endchar + + + -44 275 537 rmoveto + 5 -88 -69 -35 -58 -35 -46 -37 rlinecurve + -46 -37 -35 -57 -24 -77 rrcurveto + -11 -3 0 -6 5 hhcurveto + 5 4 2 5 3 hvcurveto + 38 60 35 39 32 19 32 19 57 24 80 27 31 -349 rcurveline + 72 103 -45 554 rlineto + endchar + + + 81 260 838 rmoveto + -21 37 -26 39 -32 38 -8 -14 -7 -14 -7 -15 33 -40 34 -41 18 -54 rrcurveto + -1 0 0 1 14 3 23 9 4 vhcurveto + 17 39 18 35 27 31 rrcurveto + 13 3 14 4 14 vhcurveto + -3 hlineto + -27 -35 -25 -36 -20 -42 rrcurveto + 68 -172 rmoveto + 28 -443 -64 -54 -95 -40 -111 20 rlinecurve + -107 46 88 134 31 69 9 24 -12 3 -8 -16 -256 -466 372 -28 146 211 rrcurveto + 49 71 30 84 85 vvcurveto + 0 -21 340 -5 78 vhcurveto + endchar + + + -64 408 -11 rmoveto + 73 26 rlineto + 0 2 4 4 2 -1 1 1 vvcurveto + -101 220 -35 97 -18 52 -24 65 -30 107 -22 44 rrcurveto + 62 -32 -26 16 -32 hhcurveto + -52 -50 -15 -16 -44 hvcurveto + 8 -25 rlineto + 5 23 32 7 15 hhcurveto + 81 45 -170 -34 4 hvcurveto + -231 -435 18 -13 59 17 26 78 9 19 128 271 rlinecurve + 1 3 2 3 4 1 rrcurveto + 4 3 -3 -3 1 hvcurveto + 146 -384 rlineto + endchar + + + 165 653 528 rmoveto + -11 3 -601 -275 rlineto + -12 vlineto + 600 -280 10 5 11 23 -5 10 -519 241 rlineto + 12 vlineto + 522 241 2 9 rlineto + endchar + + + 232 57 409 rmoveto + -40 563 -163 40 203 vlineto + endchar + + + -165 296 84 rmoveto + -10 -8 -28 -23 -19 hhcurveto + -68 -11 108 91 -7 hvcurveto + 80 101 93 133 124 vvcurveto + 59 -18 37 -53 -98 -40 -114 -82 -17 vhcurveto + -14 -64 -4 -67 -66 vvcurveto + -28 0 -28 2 -27 vhcurveto + -66 -74 15 -18 46 44 9 -3 rlineto + -70 4 4 -116 106 hhcurveto + 55 41 50 28 17 hvcurveto + 28 40 -17 13 rlineto + -176 182 rmoveto + 89 14 107 10 55 vhcurveto + 40 7 22 77 36 hhcurveto + 22 16 -10 -56 -104 -41 -95 -78 -105 hvcurveto + endchar + + + 328 393 -10 rmoveto + 74 28 rlineto + -4 69 -2 71 70 vvcurveto + 46 1 46 1 46 vhcurveto + 16 28 35 18 49 hhcurveto + 65 20 -49 -82 hvcurveto + -74 -5 -120 -16 vvcurveto + -38 21 -39 47 60 55 48 41 45 vhcurveto + -7 21 rlineto + -14 hlineto + -18 -24 -32 -22 -21 hhcurveto + -44 -7 38 27 hvcurveto + 131 vlineto + 100 6 58 -26 27 vhcurveto + 21 -21 -29 6 -29 hhcurveto + -59 -63 -35 -20 -38 hvcurveto + -16 2 rlineto + 32 -19 -34 20 -37 hhcurveto + -60 -60 -40 -28 -52 hvcurveto + -8 6 rlineto + 37 -12 37 -50 vhcurveto + -49 -2 -48 -35 -40 -32 12 -19 rcurveline + 13 23 36 16 16 hhcurveto + 41 -1 -64 -75 -91 -6 -92 -1 -92 hvcurveto + 14 -8 67 24 rlineto + -2 41 0 42 42 vvcurveto + 73 2 72 3 72 vhcurveto + 6 9 61 38 47 hhcurveto + 66 16 -48 -83 hvcurveto + -114 -10 -127 -32 vvcurveto + endchar + + + -25 381 595 rmoveto + -235 hlineto + -7 -40 rlineto + 236 hlineto + endchar + + + -545 121 595 rmoveto + -235 hlineto + -7 -40 rlineto + 236 hlineto + endchar + + + 172 54 rmoveto + 1 -2 3 -2 -2 vhcurveto + -46 -40 -101 -27 -76 39 -10 5 2 3 -10 -5 -36 -18 -22 -20 -20 -35 -40 -70 55 68 19 11 9 5 11 11 12 -6 72 -37 92 25 49 32 rrcurveto + endchar + + + 141 475 468 rmoveto + 3 13 -1 18 -19 2 -36 4 -46 9 -22 -20 -18 -17 -3 -1 -52 -115 -70 -18 rcurveline + -73 -20 -60 -19 -34 -52 rrcurveto + -25 -56 -16 -71 -73 vvcurveto + 1 -146 43 -124 19 -140 16 56 6 77 -8 66 -42 261 rcurveline + -7 43 31 18 26 14 65 35 91 9 65 33 96 49 46 47 24 118 rrcurveto + endchar + + + -14 475 468 rmoveto + 3 13 -1 18 -19 2 -36 4 -46 9 -22 -20 -18 -17 -3 -1 -52 -115 -70 -18 rcurveline + -73 -20 -60 -19 -34 -52 rrcurveto + -25 -56 -16 -71 -73 vvcurveto + 1 -146 43 -124 19 -140 16 56 6 77 -8 66 -42 261 rcurveline + -7 43 31 18 26 14 65 35 91 9 65 33 96 49 46 47 24 118 rrcurveto + endchar + + + 41 196 165 rmoveto + -55 -17 -58 -12 -61 -7 -22 -129 rcurveline + 89 21 76 15 74 38 40 20 31 22 20 24 37 46 7 10 15 74 5 25 -13 13 -31 1 -31 1 -22 -1 -12 -4 rrcurveto + -18 -16 -18 -37 -17 hvcurveto + -17 -37 -12 -29 -9 -19 rrcurveto + endchar + + + 198 487 176 rmoveto + 19 29 16 43 12 58 3 16 -2 15 -16 2 -33 4 -49 10 -22 -20 -16 -15 -12 -19 -7 -23 -7 -23 -9 -21 -10 -20 -8 -15 0 -15 8 -13 -68 -20 -105 -32 -90 16 rrcurveto + -28 5 -17 15 -7 23 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 55 -6 58 6 62 17 102 27 106 59 48 71 rrcurveto + endchar + + + 105 446 279 rmoveto + 3 14 -95 48 -20 -26 -69 -91 rcurveline + -13 -16 -16 -32 19 -19 -44 -13 -78 -22 -49 12 -24 6 -12 29 2 29 rrcurveto + 4 -6 1 -3 -5 vhcurveto + -40 -58 -28 -101 65 -32 24 -12 33 4 25 6 142 31 153 106 31 137 rrcurveto + endchar + + + 294 484 99 rmoveto + 44 29 31 29 20 29 20 29 15 42 12 58 3 17 -2 15 -16 2 -34 4 -48 9 -22 -20 -7 -7 -5 -4 -1 -3 -44 -98 rcurveline + -8 -16 -7 -17 11 -18 -76 -21 -104 -25 -91 -3 -59 -3 -65 6 -12 43 -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 60 -6 72 6 85 17 85 17 71 27 55 36 rrcurveto + endchar + + + 150 402 251 rmoveto + 20 18 15 18 11 17 19 29 8 29 8 40 5 25 -13 13 -31 1 -31 1 -22 0 -12 -4 rrcurveto + -10 -10 -8 -14 -10 hvcurveto + -23 -33 -18 -48 -18 -38 -7 -2 -6 -1 -7 -3 -57 -22 -70 -15 -44 -32 -60 -43 -19 -78 -20 -96 rrcurveto + -6 9 0 3 3 vhcurveto + 16 30 23 27 29 22 36 27 65 28 53 20 62 23 60 31 46 41 rrcurveto + endchar + + + 230 195 26 rmoveto + 37 45 39 33 38 20 76 40 68 31 53 62 26 31 20 49 13 66 3 17 -1 14 -17 2 -33 4 -49 10 -22 -20 -9 -9 -5 -5 -1 -3 -15 -34 -15 -35 -16 -34 rrcurveto + -8 -16 0 -15 8 -13 -98 -29 -69 -50 -40 -74 -40 -74 -41 -78 -41 -82 5 30 rcurveline + 1 vlineto + -54 -65 rlineto + -1 vlineto + -3 -38 -3 -41 2 -30 6 -17 rlinecurve + 6 -17 12 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 rrcurveto + endchar + + + 79 241 257 rmoveto + -5 -4 -1 -2 -2 hvcurveto + -63 -15 -51 -24 -33 -42 -30 -39 -29 -78 -24 -54 21 -2 rcurveline + 9 22 12 20 17 18 42 43 64 21 61 23 68 26 53 42 34 62 17 33 14 39 9 45 3 17 -1 14 -17 2 -33 4 -49 9 -22 -20 -31 -29 -16 -48 -14 -43 rrcurveto + -7 -19 1 -14 6 -10 rrcurveto + endchar + + + 314 52 5 rmoveto + 52 37 53 33 52 29 47 26 43 23 40 35 57 48 27 50 18 91 4 16 -2 15 -17 2 -33 4 -49 10 -22 -20 -16 -16 -11 -19 -7 -22 -7 -22 -9 -21 -11 -20 rrcurveto + -8 -16 0 -15 8 -13 -4 -2 -4 -1 -4 -2 -42 -17 -41 -16 -38 -18 -29 -15 -23 -16 -18 -20 -20 -23 -25 -40 -13 -42 42 -29 rcurveline + 6 4 3 1 1 1 rrcurveto + endchar + + + 84 283 128 rmoveto + 40 20 30 23 20 24 37 45 7 11 15 73 5 25 -13 14 -31 1 -31 1 -22 -2 -12 -4 rrcurveto + -18 -16 -18 -37 -17 hvcurveto + -17 -37 -12 -29 -9 -19 -31 -11 -27 -8 -21 -6 -30 -9 -67 -23 -17 -27 -15 -24 -4 -29 -13 -27 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 11 17 1 1 rcurveline + 60 55 111 20 77 39 rrcurveto + endchar + + + 357 271 13 rmoveto + 140 23 143 48 82 76 50 45 17 46 17 82 3 17 -2 14 -16 2 -33 4 -49 10 -22 -20 -7 -7 -5 -5 -1 -2 -44 -99 rcurveline + -8 -16 -6 -18 10 -17 -58 -16 -59 -17 -61 -12 -88 -18 -143 -22 -39 70 -19 32 7 49 33 65 4 8 -9 1 -3 -4 -25 -35 -37 -65 -19 -48 -15 -41 -17 -56 21 -42 rrcurveto + 12 -23 23 -14 34 -5 50 -7 63 4 76 13 rrcurveto + endchar + + + 60 223 227 rmoveto + -2 -1 -6 -2 -3 -1 -73 -18 -48 -25 -22 -33 -22 -33 -23 -44 -24 -57 18 -13 rcurveline + 1 hlineto + 23 36 30 26 37 14 37 14 39 16 38 17 38 17 36 25 33 34 33 34 25 54 15 76 3 17 -1 14 -17 2 -18 2 -19 2 -20 2 -32 3 -24 -16 -8 -20 rrcurveto + -15 -33 -14 -34 -15 -32 -8 -16 0 -14 8 -13 rrcurveto + endchar + + + 41 196 165 rmoveto + -55 -17 -58 -12 -61 -7 -22 -129 rcurveline + 89 21 76 15 74 38 40 20 31 22 20 24 37 46 7 10 15 74 5 25 -13 13 -31 1 -31 1 -22 -1 -12 -4 rrcurveto + -18 -16 -18 -37 -17 hvcurveto + -17 -37 -12 -29 -9 -19 rrcurveto + endchar + + + 36 239 21 rmoveto + 89 26 92 36 46 56 37 46 7 9 15 74 5 25 -13 14 -31 1 -31 1 -22 -1 -12 -4 rrcurveto + -18 -16 -19 -37 -17 hvcurveto + -17 -37 -12 -28 -9 -19 -31 -9 rcurveline + -67 -18 -172 -41 -23 80 -13 -35 -13 -43 -13 -50 1 -29 27 -14 28 -3 59 -5 61 6 63 18 rrcurveto + endchar + + + -4 35 9 rmoveto + 53 -29 150 43 95 48 40 20 40 26 27 34 28 34 9 33 10 49 5 25 -13 13 -31 1 -31 1 -9 0 -25 -4 -14 -2 -5 -5 -10 -14 -24 -33 -18 -48 -18 -39 rrcurveto + -58 -29 -103 -14 -46 14 -23 7 -13 30 4 30 1 8 -3 0 -6 -8 -8 -10 -88 -135 84 -46 rrcurveto + endchar + + + 131 178 4 rmoveto + 102 10 106 30 78 38 44 21 33 23 21 26 37 46 6 11 15 74 5 25 -13 14 -31 1 -31 1 -21 -2 -12 -4 rrcurveto + -18 -17 -18 -38 -16 hvcurveto + -16 -38 -13 -28 -9 -19 -74 -21 -89 -24 -90 -2 -59 -3 -65 6 -12 43 -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 36 -3 40 1 46 4 rrcurveto + endchar + + + -6 402 251 rmoveto + 20 18 15 18 11 17 19 29 8 29 8 40 5 25 -13 13 -31 1 -31 1 -22 0 -12 -4 rrcurveto + -10 -10 -8 -14 -10 hvcurveto + -23 -33 -18 -48 -18 -38 -7 -2 -6 -1 -7 -3 -57 -22 -70 -15 -44 -32 -60 -43 -19 -78 -20 -96 rrcurveto + -6 9 0 3 3 vhcurveto + 16 30 23 27 29 22 36 27 65 28 53 20 62 23 60 31 46 41 rrcurveto + endchar + + + 67 348 142 rmoveto + 1 vlineto + 61 24 56 30 32 38 37 46 7 10 15 74 5 25 -13 13 -31 1 -31 1 -22 -1 -12 -4 rrcurveto + -18 -17 -18 -37 -16 hvcurveto + -16 -37 -13 -29 -9 -19 -27 -8 -31 -17 -21 -14 -116 -76 -50 -138 -64 -128 4 30 rcurveline + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 59 71 20 13 76 32 rrcurveto + endchar + + + -35 188 121 rmoveto + 75 25 91 37 41 50 37 45 7 12 15 73 5 25 -13 13 -31 1 -31 1 -21 -1 -12 -4 rrcurveto + -18 -17 -18 -37 -17 hvcurveto + -17 -37 -12 -29 -9 -19 -38 -11 -16 -6 -37 -13 -36 -13 -29 -21 -22 -29 -16 -20 -13 -23 -12 -26 -12 -26 -14 -32 -16 -36 21 -2 rcurveline + 9 21 13 18 18 18 32 31 42 18 53 15 rrcurveto + endchar + + + -52 52 7 rmoveto + 52 36 52 33 53 29 47 25 43 25 40 35 57 47 28 50 18 91 4 17 -2 15 -17 2 -33 4 -49 9 -22 -20 -16 -15 -12 -19 -7 -23 -7 -23 -8 -20 -11 -20 rrcurveto + -8 -16 0 -14 8 -13 -44 -21 -48 -15 -42 -20 -29 -15 -22 -17 -18 -19 -21 -23 -24 -39 -14 -43 42 -30 rcurveline + 1 hlineto + 4 3 3 2 2 2 rrcurveto + endchar + + + -69 420 342 rmoveto + 5 25 -13 14 -31 1 -31 1 -21 -1 -12 -4 rrcurveto + -18 -18 -24 -48 -17 hvcurveto + -17 -48 -13 -33 -9 -20 -37 -13 -42 -12 -33 -15 -39 -18 -32 -48 -19 -44 rrcurveto + -1 vlineto + -15 -18 -4 -16 9 -13 9 -13 10 2 12 17 21 20 27 16 33 11 32 7 32 9 30 12 105 41 72 92 24 121 rrcurveto + endchar + + + 216 79 3 rmoveto + 96 -12 148 27 87 26 86 23 104 41 46 56 37 46 7 9 15 74 5 25 -13 14 -31 1 -31 1 -22 -1 -12 -4 rrcurveto + -18 -17 -19 -37 -16 hvcurveto + -16 -37 -13 -28 -9 -19 -44 -13 -50 -13 -46 -9 -49 -11 -45 -6 -40 -2 -66 -4 -61 9 -23 41 -19 32 8 49 33 65 4 8 -9 1 -3 -4 -25 -35 -37 -65 -19 -48 rrcurveto + -15 -41 -17 -56 21 -42 12 -23 23 -14 34 -5 rrcurveto + endchar + + + -95 237 131 rmoveto + 45 22 32 25 20 24 37 45 8 13 15 73 5 25 -13 13 -31 1 -31 1 -21 -1 -12 -4 rrcurveto + -18 -17 -18 -38 -17 hvcurveto + -17 -38 -12 -29 -9 -19 -8 -2 -11 -5 -15 -7 -22 -10 -34 -17 -17 -14 -46 -38 -22 -60 -26 -60 18 -13 rcurveline + 1 hlineto + 13 21 19 19 23 16 46 31 65 18 52 26 rrcurveto + endchar + + + 347 778 276 rmoveto + -657 hlineto + -7 -40 rlineto + 658 hlineto + endchar + + + 137 415 434 rmoveto + 2 -57 2 -57 -58 vvcurveto + -21 -2 -73 -1 -48 vhcurveto + -39 -36 -56 -24 -36 hhcurveto + -85 -8 73 56 hvcurveto + 269 vlineto + -9 7 -83 -26 rlineto + 4 -24 13 -85 -55 vvcurveto + -189 vlineto + -92 -2 -92 -2 -92 vhcurveto + 12 -6 53 20 rlineto + -13 63 -6 75 66 vvcurveto + 6 2 rlineto + -20 17 13 -10 32 hhcurveto + 49 76 43 33 58 hvcurveto + 8 -5 rlineto + -41 6 11 -28 52 hhcurveto + 55 56 46 38 41 hvcurveto + -8 14 -11 2 rlineto + -15 -24 -30 -18 -23 hhcurveto + -47 -5 65 34 hvcurveto + 167 vlineto + 31 3 51 3 41 vhcurveto + -8 11 rlineto + endchar + + + 58 81 502 rmoveto + -24 -32 215 -215 -214 -215 23 -33 220 219 219 -219 23 33 -214 215 218 217 -25 32 -221 -221 rlineto + endchar + + + 86 195 18 rmoveto + -2 40 -1 30 28 vvcurveto + 73 3 88 3 72 vhcurveto + 29 36 47 32 46 hhcurveto + 71 19 -61 -100 hvcurveto + -5 -171 rlineto + -48 17 -40 55 48 63 44 45 46 vhcurveto + -9 21 rlineto + -13 hlineto + -19 -25 -32 -21 -23 hhcurveto + -55 7 45 151 64 0 96 -20 24 hvcurveto + 22 -19 -29 7 -29 hhcurveto + -64 -69 -38 -34 -56 hvcurveto + -8 6 rlineto + 37 -6 -16 31 -50 hhcurveto + -37 -57 -41 -30 -41 hvcurveto + 17 -22 rlineto + 19 29 25 16 21 hhcurveto + 33 4 -48 -67 -81 -7 -165 -2 -51 hvcurveto + 15 -7 rlineto + endchar + + + -45 214 11 rmoveto + 13 83 69 97 54 79 rrcurveto + 52 77 60 96 85 vvcurveto + 107 -71 67 -145 vhcurveto + -50 -22 -88 -46 -29 -36 rrcurveto + -29 -36 -10 -45 -52 vvcurveto + -96 85 -70 69 52 49 17 26 49 vhcurveto + 5 -6 rlineto + -32 -55 -85 -114 0 vvcurveto + -45 -58 -48 -64 -20 -46 10 -8 rcurveline + 222 393 rmoveto + -24 -24 -35 -8 -33 hhcurveto + -84 -46 86 77 52 33 77 57 108 55 -78 -84 -35 -6 -38 -25 -25 hvcurveto + endchar + + + -47 293 134 rmoveto + -3 5 -34 111 3 112 -5 144 rlinecurve + -1 32 -16 27 -26 14 -26 14 -29 -15 -14 -15 -39 -42 -136 -221 91 -41 54 -25 54 37 24 35 1 -125 16 -83 29 -100 rrcurveto + -142 395 rmoveto + -6 5 -2 8 4 7 11 21 11 26 33 -5 19 -3 14 -25 5 -16 rrcurveto + -2 7 -12 -1 -2 hvcurveto + -23 -16 -46 -7 -23 18 rrcurveto + endchar + + + -99 225 94 rmoveto + -2 3 -24 78 2 78 -3 101 rlinecurve + -1 23 -11 19 -18 9 -18 10 -21 -10 -10 -11 -27 -29 -95 -155 64 -29 37 -17 38 26 17 24 1 -87 11 -58 20 -70 rrcurveto + -99 276 rmoveto + -4 4 -2 5 3 5 8 15 7 18 24 -3 13 -3 10 -17 3 -11 rrcurveto + -1 5 -9 -2 hhcurveto + -16 -12 -32 -4 -16 12 rrcurveto + endchar + + + -99 225 363 rmoveto + -2 3 -24 78 2 78 -3 101 rlinecurve + -1 23 -11 19 -18 9 -18 10 -21 -10 -10 -11 -27 -29 -95 -155 64 -29 37 -17 38 26 17 24 1 -87 11 -58 20 -70 rrcurveto + -99 276 rmoveto + -4 4 -2 5 3 5 8 15 7 18 24 -3 13 -3 10 -17 3 -11 rrcurveto + -1 5 -9 -2 hhcurveto + -16 -12 -32 -4 -16 12 rrcurveto + endchar + + + 164 7 rmoveto + 10 50 46 58 36 47 rrcurveto + 36 46 40 59 50 vvcurveto + 65 -49 39 -98 vhcurveto + -34 -13 -60 -27 -19 -22 rrcurveto + -19 -22 -7 -27 -31 vvcurveto + -58 58 -42 46 35 34 10 16 32 vhcurveto + 5 -3 rlineto + -22 -33 -58 -69 0 vvcurveto + -30 -35 -33 -38 -14 -28 7 -4 rcurveline + 151 235 rmoveto + -14 -16 -25 -5 -22 hhcurveto + -57 -31 51 47 31 23 46 38 73 38 -46 -51 -21 -4 -23 -17 -15 hvcurveto + endchar + + + 164 282 rmoveto + 10 50 46 58 36 47 rrcurveto + 36 46 40 59 50 vvcurveto + 65 -49 39 -98 vhcurveto + -34 -13 -60 -27 -19 -22 rrcurveto + -19 -22 -7 -27 -31 vvcurveto + -58 58 -42 46 35 34 10 16 32 vhcurveto + 5 -3 rlineto + -22 -33 -58 -69 0 vvcurveto + -30 -35 -33 -38 -14 -28 7 -4 rcurveline + 151 235 rmoveto + -14 -16 -25 -5 -22 hhcurveto + -57 -31 51 47 31 23 46 38 73 38 -46 -51 -21 -4 -23 -17 -15 hvcurveto + endchar + + + 99 368 242 rmoveto + -9 vlineto + -32 -29 -40 -24 -48 -19 rrcurveto + -12 -31 -33 -6 -35 hhcurveto + -20 -21 2 4 -21 hvcurveto + -35 15 -17 21 29 vvcurveto + 10 2 12 5 12 vhcurveto + 18 49 20 40 18 40 74 -50 rcurveline + 16 28 0 1 16 28 11 19 10 19 11 20 -27 18 -26 18 -27 18 -15 8 rcurveline + -17 -29 -21 -36 -16 -30 rrcurveto + -59 -107 -28 -85 -62 vvcurveto + -71 26 -49 42 -20 vhcurveto + -9 19 21 -6 23 hhcurveto + 24 27 6 10 29 hvcurveto + 56 21 46 36 37 53 37 54 25 61 12 68 rrcurveto + 4 19 1 20 19 vvcurveto + 47 -11 45 -21 44 vhcurveto + -54 -125 rlineto + 13 -42 12 -40 -54 vvcurveto + endchar + + + 64 368 242 rmoveto + -9 vlineto + -32 -29 -40 -24 -48 -19 rrcurveto + -12 -31 -33 -6 -35 hhcurveto + -20 -21 2 4 -21 hvcurveto + -35 15 -17 21 29 vvcurveto + 10 2 12 5 12 vhcurveto + 18 49 20 40 18 40 74 -50 rcurveline + 16 28 0 1 16 28 11 19 10 19 11 20 -27 18 -26 18 -27 18 -15 8 rcurveline + -17 -29 -21 -36 -16 -30 rrcurveto + -59 -107 -28 -85 -62 vvcurveto + -71 26 -49 42 -20 vhcurveto + -9 19 21 -6 23 hhcurveto + 24 27 6 10 29 hvcurveto + 56 21 46 36 37 53 37 54 25 61 12 68 rrcurveto + 4 19 1 20 19 vvcurveto + 47 -11 45 -21 44 vhcurveto + -54 -125 rlineto + 13 -42 12 -40 -54 vvcurveto + endchar + + + 173 550 226 rmoveto + 47 123 -54 -6 -18 14 -16 30 -27 -5 rlinecurve + -52 -10 -26 -44 -27 -37 -41 -56 -34 -63 -56 -42 -31 -2 -12 23 -7 21 -25 77 41 197 -133 -150 -46 -52 -24 -72 -9 -88 16 30 13 32 20 26 69 89 20 -52 9 -79 rrcurveto + 6 -47 3 -48 29 -25 15 -13 22 -3 15 15 46 45 28 62 35 55 97 153 -6 -112 58 2 rrcurveto + endchar + + + 173 461 225 rmoveto + 8 -12 13 19 20 50 20 50 5 30 -10 10 -30 29 -49 -33 -18 -21 -15 -18 -14 -18 -13 -19 -41 -56 -36 -63 -55 -42 -16 -1 -11 5 -7 9 -19 25 -6 31 -1 46 rrcurveto + -1 42 -1 62 -34 2 -14 1 -23 -19 -33 -37 -44 -49 -27 -71 -9 -92 8 15 8 16 7 15 18 37 58 74 22 -27 13 -16 9 -28 5 -40 5 -47 4 -49 29 -24 rrcurveto + 18 -16 17 0 16 15 23 22 20 26 16 29 24 44 52 91 31 21 28 19 16 -15 14 -22 rrcurveto + endchar + + + 99 371 650 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + -22 -525 rmoveto + 76 109 31 145 -59 124 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 -64 -59 -99 -47 -118 21 -107 46 88 134 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 rrcurveto + endchar + + + 99 349 125 rmoveto + 76 109 31 145 -59 124 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 -64 -59 -99 -47 -118 21 -107 46 88 134 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 rrcurveto + endchar + + + 99 349 125 rmoveto + 76 109 31 145 -59 124 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 -64 -59 -99 -47 -118 21 -107 46 88 134 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 rrcurveto + endchar + + + 514 543 154 rmoveto + -80 -18 -77 -6 -73 5 -73 5 -71 32 -68 59 -27 23 -16 21 -2 19 -2 19 5 16 13 15 52 59 61 42 70 25 70 25 73 18 75 10 52 113 rcurveline + -79 -3 -79 -18 -80 -35 -80 -35 -67 -47 -53 -61 -35 -40 -24 -43 -15 -46 -37 -114 46 -76 71 -51 44 -32 65 -21 85 -11 102 -12 106 27 78 31 88 35 92 59 39 80 rrcurveto + 30 62 7 56 -16 49 rrcurveto + -24 74 0 0 0 vvcurveto + -77 -113 10 -28 23 -61 -2 -33 rlinecurve + 0 0 1 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -8 rrcurveto + endchar + + + 3 -72 rmoveto + 9 -1 9 3 9 6 26 16 12 26 14 32 3 7 -2 5 -5 -7 -7 -8 -8 -6 -9 -3 -9 -4 -11 0 -9 1 rrcurveto + -9 -9 3 7 -8 hvcurveto + -8 5 -6 7 -4 10 -4 9 0 12 3 13 3 12 8 14 12 17 rrcurveto + 3 vlineto + 1 -1 0 -1 -3 -4 -3 -8 -6 vhcurveto + -15 -21 -9 -22 -10 -32 -4 -16 -1 -14 1 -12 2 -33 17 -16 34 -3 rrcurveto + endchar + + + 86 315 620 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + -167 -581 rmoveto + -2 40 -1 30 28 vvcurveto + 73 3 88 3 72 vhcurveto + 29 36 47 32 46 hhcurveto + 71 19 -61 -100 hvcurveto + -5 -171 rlineto + -48 17 -40 55 48 63 44 45 46 vhcurveto + -9 21 rlineto + -13 hlineto + -19 -25 -32 -21 -23 hhcurveto + -55 7 45 151 64 0 96 -20 24 hvcurveto + 22 -19 -29 7 -29 hhcurveto + -64 -69 -38 -34 -56 hvcurveto + -8 6 rlineto + 37 -6 -16 31 -50 hhcurveto + -37 -57 -41 -30 -41 hvcurveto + 17 -22 rlineto + 19 29 25 16 21 hhcurveto + 33 4 -48 -67 -81 -7 -165 -2 -51 hvcurveto + 15 -7 rlineto + endchar + + + -16 531 452 rmoveto + -57 16 -23 -10 -33 -129 -36 -110 -56 -118 rlinecurve + -5 hlineto + -26 119 -37 164 -55 55 rrcurveto + 21 -21 -33 11 -30 hhcurveto + -53 -43 -22 -39 -35 hvcurveto + 20 -26 rlineto + 10 15 21 8 31 hhcurveto + 73 43 -98 -66 23 hvcurveto + 27 -77 16 -81 12 -81 7 -7 rcurveline + 56 32 20 50 22 48 24 48 rlinecurve + 136 274 rlineto + endchar + + + 170 10 228 rmoveto + 6 -10 rlineto + 165 hlineto + -54 -195 4 -14 33 -3 59 212 rlineto + 207 hlineto + -54 -195 4 -14 33 -3 59 212 rlineto + 164 hlineto + 12 8 -6 33 rlineto + -158 hlineto + 58 209 rlineto + 154 hlineto + 12 8 -6 33 rlineto + -149 hlineto + 52 186 -7 10 -22 2 -11 -3 -54 -195 rlineto + -207 hlineto + 52 186 -7 10 -22 2 -11 -3 -54 -195 rlineto + -183 hlineto + -8 -10 4 -21 6 -10 rlineto + 170 hlineto + -59 -209 rlineto + -178 hlineto + -8 -10 rlineto + 229 10 rmoveto + 58 209 rlineto + 207 hlineto + -59 -209 rlineto + endchar + + + -8 431 59 rmoveto + 44 49 14 66 65 vvcurveto + 112 -51 114 -147 -70 -71 -22 -52 -47 vhcurveto + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + 74 18 54 36 54 hhcurveto + endchar + + + -44 366 694 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 227 -481 rmoveto + 44 49 14 66 65 vvcurveto + 112 -51 114 -147 -70 -71 -22 -52 -47 vhcurveto + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + 74 18 54 36 54 hhcurveto + endchar + + + -44 88 555 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + 174 -677 rmoveto + 44 49 14 66 65 vvcurveto + 112 -51 114 -147 -70 -71 -22 -52 -47 vhcurveto + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + 74 18 54 36 54 hhcurveto + endchar + + + -8 429 595 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 204 -536 rmoveto + 44 49 14 66 65 vvcurveto + 112 -51 114 -147 -70 -71 -22 -52 -47 vhcurveto + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + 74 18 54 36 54 hhcurveto + endchar + + + 270 770 319 rmoveto + 11 5 10 4 12 vvcurveto + 77 -56 61 -86 -76 -72 -33 -57 -49 vhcurveto + -2 -2 rlineto + 47 -30 -51 32 -78 hhcurveto + -70 -71 -22 -52 -47 hvcurveto + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + 1 1 1 2 2 1 rrcurveto + -44 24 42 -31 66 hhcurveto + 86 80 58 58 62 hvcurveto + -13 18 -11 2 rlineto + -35 -45 -54 -33 -55 hhcurveto + -89 -34 78 63 -6 hvcurveto + 42 199 rmoveto + 26 21 30 16 33 hhcurveto + 56 35 -52 -42 -16 -7 -8 -6 -2 hvcurveto + -202 -80 -4 4 rlineto + -1 6 -1 6 6 vvcurveto + 49 7 45 39 42 vhcurveto + -388 -80 rmoveto + 74 18 54 36 54 hhcurveto + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + endchar + + + 127 414 623 rmoveto + -21 37 -26 39 -32 38 -8 -14 -7 -14 -7 -15 33 -40 34 -41 18 -54 rrcurveto + -1 0 0 1 14 3 23 9 4 vhcurveto + 17 39 18 35 27 31 rrcurveto + 13 3 14 4 14 vhcurveto + -3 hlineto + -27 -35 -25 -36 -20 -42 rrcurveto + -184 -615 rmoveto + 180 35 163 279 -129 131 -12 12 -28 13 -15 -17 -32 -36 -16 -48 -22 -44 -10 -20 -3 -24 15 -17 17 -19 43 -2 32 7 7 -10 7 -20 -7 -7 -20 -23 -25 -19 -31 -12 rrcurveto + -115 -47 -121 -40 -104 -58 -6 -3 0 -10 7 -1 73 -7 79 -7 73 14 rrcurveto + endchar + + + -44 121 695 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 263 -672 rmoveto + 44 49 14 66 65 vvcurveto + 112 -51 114 -147 -70 -71 -22 -52 -47 vhcurveto + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + 74 18 54 36 54 hhcurveto + endchar + + + 226 609 409 rmoveto + 48 -41 20 -63 -61 vvcurveto + -87 -45 -96 -94 -94 -14 118 85 65 0 71 9 59 vhcurveto + -6 7 -75 -28 rlineto + -189 vlineto + -53 -4 -71 -33 -33 vhcurveto + -24 -24 -31 -18 -34 hhcurveto + -90 -30 102 80 91 30 69 78 60 hvcurveto + -16 14 rlineto + -135 -47 -39 -126 -117 vvcurveto + -91 54 -98 104 70 57 54 46 45 vhcurveto + 12 hlineto + -77 36 28 -14 57 hhcurveto + 146 105 168 142 64 -25 62 -51 40 hvcurveto + -14 -3 -42 -48 rlineto + endchar + + + -45 92 639 rmoveto + -27 83 vlineto + 62 -15 -82 -111 -140 -3 -140 -5 -139 hvcurveto + 12 -5 84 27 rlineto + -3 76 0 198 136 vvcurveto + 89 2 90 5 89 vhcurveto + -6 12 rlineto + endchar + + + -176 108 14 rmoveto + 33 69 26 89 -11 109 rrcurveto + 4 -2 12 4 vvcurveto + -13 108 -30 91 -34 85 -19 -46 -18 -50 -15 -44 54 -117 34 -155 -21 -173 8 -3 5 11 3 6 rrcurveto + endchar + + + -99 144 10 rmoveto + 23 48 18 62 -8 77 rrcurveto + 3 -1 8 3 vvcurveto + -9 75 -21 64 -24 60 -13 -33 -13 -35 -10 -30 37 -82 24 -109 -15 -121 6 -2 4 8 2 4 rrcurveto + endchar + + + -99 144 279 rmoveto + 23 48 18 62 -8 77 rrcurveto + 3 -1 8 3 vvcurveto + -9 75 -21 64 -24 60 -13 -33 -13 -35 -10 -30 37 -82 24 -109 -15 -121 6 -2 4 8 2 4 rrcurveto + endchar + + + 227 427 rmoveto + -146 -44 rlineto + -16 56 vlineto + 42 -10 -49 -67 -84 -2 -84 -3 -83 hvcurveto + 8 -3 57 16 rlineto + -2 46 0 118 82 vvcurveto + 53 1 55 4 53 vhcurveto + endchar + + + 227 702 rmoveto + -146 -44 rlineto + -16 56 vlineto + 42 -10 -49 -67 -84 -2 -84 -3 -83 hvcurveto + 8 -3 57 16 rlineto + -2 46 0 118 82 vvcurveto + 53 1 55 4 53 vhcurveto + endchar + + + 245 589 704 rmoveto + -11 -1 -433 -680 rlineto + -14 vlineto + 31 -13 437 688 -3 11 rlineto + -587 -36 rmoveto + -16 60 vlineto + 44 -10 -49 -67 -84 -1 -85 -4 -83 hvcurveto + 8 -3 61 17 rlineto + -2 46 -1 118 82 vvcurveto + 53 2 54 4 53 vhcurveto + -5 8 rlineto + 566 -651 rmoveto + -222 hlineto + -4 -6 0 4 1 1 0 1 1 hvcurveto + 86 83 115 105 85 vvcurveto + 54 -47 39 -62 -61 -52 -33 -35 -39 vhcurveto + 14 -11 rlineto + 19 28 31 19 40 hhcurveto + 59 23 -45 -34 -71 -57 -61 -56 -55 hvcurveto + -38 -37 -41 -35 -41 -35 rrcurveto + -10 315 vlineto + 17 47 rlineto + endchar + + + 245 593 704 rmoveto + -11 -1 -433 -680 rlineto + -14 vlineto + 31 -13 437 688 -3 11 rlineto + -591 -36 rmoveto + -16 60 vlineto + 44 -10 -49 -67 -84 -1 -85 -4 -83 hvcurveto + 8 -3 61 17 rlineto + -2 46 -1 118 82 vvcurveto + 53 2 54 4 53 vhcurveto + -5 8 rlineto + 435 -304 rmoveto + -206 -260 rlineto + -27 204 vlineto + 5 -5 rlineto + -38 1 -50 -4 -21 vhcurveto + 3 -3 58 20 rlineto + -2 13 -1 48 32 vvcurveto + 6 4 rlineto + 59 hlineto + 12 23 -3 4 rlineto + -68 hlineto + -6 5 rlineto + 93 1 164 1 16 vhcurveto + -6 3 rlineto + -55 -281 rmoveto + -155 hlineto + -3 4 1 13 60 83 27 35 rlinecurve + 21 27 21 28 25 23 rrcurveto + 1 1 1 1 2 hhcurveto + 2 1 -1 -4 hvcurveto + -205 vlineto + endchar + + + -367 -28 685 rmoveto + -17 61 vlineto + 46 -12 -53 -73 -91 -3 -91 -3 -90 hvcurveto + 9 -3 62 17 rlineto + -2 49 0 130 88 vvcurveto + 58 1 58 4 58 vhcurveto + -5 8 rlineto + endchar + + + 104 41 rmoveto + 6 17 2 14 10 vvcurveto + 5 vlineto + 15 -2 -4 10 -14 hhcurveto + -23 -28 -33 -23 -22 20 -10 15 -8 hvcurveto + -4 -4 -6 -5 -8 -6 -31 -22 -38 -22 -31 -21 rrcurveto + -5 -3 -3 -2 -1 vvcurveto + 18 2 16 6 14 5 41 14 26 20 24 32 5 -3 5 -1 4 -5 rrcurveto + 6 9 4 7 11 vvcurveto + 1 vlineto + -1 6 -4 4 -4 3 rrcurveto + -85 hmoveto + 6 17 2 14 10 vvcurveto + 17 -6 13 -14 -24 -28 -33 -23 -22 20 -10 15 -8 vhcurveto + -4 -4 -6 -5 -8 -6 -31 -22 -38 -22 -31 -21 rrcurveto + -5 -3 -2 -2 -1 vvcurveto + 6 1 60 17 40 17 32 44 rlinecurve + 6 -3 3 -1 5 -5 rrcurveto + 5 9 6 7 11 vvcurveto + 1 vlineto + -1 6 -4 4 -4 3 rrcurveto + 59 41 rmoveto + 1 hlineto + 8 5 -8 -10 -4 -1 -5 -1 -7 hvcurveto + -9 5 -10 4 -7 7 rrcurveto + -1 2 0 1 2 vvcurveto + 7 9 5 6 1 vhcurveto + -86 hmoveto + 2 hlineto + 9 4 -9 -10 -4 -1 -5 -1 -6 hvcurveto + -8 4 -19 7 11 vvcurveto + 7 8 4 6 1 vhcurveto + endchar + + + -179 269 550 rmoveto + 15 -23 -33 8 -23 hhcurveto + -123 -52 -90 -92 -59 28 -70 81 43 41 20 21 36 hvcurveto + 11 -2 rlineto + -22 4 10 -17 27 hhcurveto + 23 41 22 16 29 hvcurveto + -5 16 rlineto + -5 -16 -22 -7 -10 hhcurveto + -25 -2 26 16 hvcurveto + 25 -2 26 25 vvcurveto + 48 2 49 3 48 vhcurveto + -4 3 rlineto + -55 -236 rmoveto + -14 -21 -28 -15 -29 hhcurveto + -27 -29 6 21 -16 hvcurveto + -17 23 -5 28 1 27 1 66 21 35 17 14 rrcurveto + 16 20 24 9 27 hhcurveto + 18 18 -9 -12 13 hvcurveto + 12 -11 0 -17 -17 vvcurveto + endchar + + + -189 159 261 rmoveto + 51 53 13 34 35 hvcurveto + 32 32 10 43 42 vvcurveto + 43 -13 48 -37 30 vhcurveto + 21 -26 -35 5 -34 hhcurveto + -51 -53 -14 -34 -35 hvcurveto + -35 -34 -5 -48 -45 vvcurveto + -71 6 37 -65 100 hhcurveto + -74 214 rmoveto + 47 13 41 25 39 hhcurveto + 83 14 -81 -53 -54 -17 -71 -79 -81 -19 82 55 17 2 17 4 16 hvcurveto + endchar + + + -25 431 59 rmoveto + 44 49 14 66 65 vvcurveto + 88 -31 88 -84 35 vhcurveto + 28 65 -6 11 -22 5 -10 -2 -29 -68 rlineto + 3 -14 -14 1 -16 hhcurveto + -70 -71 -22 -52 -47 hvcurveto + -48 -52 -7 -74 -69 vvcurveto + 5 -74 25 -73 62 -38 -34 -79 rcurveline + 2 -14 32 -8 37 85 rlineto + -6 19 22 -3 24 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 18 16 -3 -6 14 hvcurveto + -145 -334 rlineto + -28 44 -9 63 49 vvcurveto + 26 2 26 6 25 vhcurveto + 74 18 54 36 54 hhcurveto + 132 -206 rmoveto + -83 -23 -110 -108 -28 -23 8 14 -18 vhcurveto + 150 345 rlineto + 41 -42 9 -76 -56 vvcurveto + endchar + + + -8 267 620 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + 117 -540 rmoveto + 44 49 14 66 65 vvcurveto + 112 -51 114 -147 -70 -71 -22 -52 -47 vhcurveto + -48 -52 -7 -74 -69 vvcurveto + -106 7 49 -104 138 hhcurveto + 70 72 20 53 47 hvcurveto + -163 367 rmoveto + 113 19 -124 -82 -83 -23 -110 -108 -109 -26 128 84 26 2 26 6 25 hvcurveto + 74 18 54 36 54 hhcurveto + endchar + + + 17 203 -206 rmoveto + -6 52 -3 97 -1 46 10 8 rcurveline + -5 19 20 -3 20 hhcurveto + 155 105 162 147 75 -35 92 -102 -69 -61 -31 -43 -54 hvcurveto + -8 4 rlineto + 44 -4 -16 31 -45 hhcurveto + -44 -52 -36 -32 -40 hvcurveto + 14 -19 rlineto + 14 24 28 15 21 hhcurveto + 30 9 -52 -45 hvcurveto + -221 vlineto + -57 -1 -205 -5 -58 vhcurveto + 10 -11 rlineto + 73 303 rmoveto + 1 -2 103 82 11 3 76 6 vvcurveto + 37 47 41 21 51 hhcurveto + 64 39 -77 -87 -95 -34 -115 -121 -33 -31 15 22 -24 hvcurveto + endchar + + + -92 294 13 rmoveto + 62 -19 7 7 rlineto + -2 140 -5 141 141 vvcurveto + 59 2 59 3 59 vhcurveto + 3 40 33 9 38 5 rrcurveto + 18 vlineto + -7 7 -150 3 -148 3 -95 -95 -6 -106 rlinecurve + -4 -84 52 -97 128 -10 rrcurveto + 29 -2 67 2 -19 vvcurveto + -25 -6 -135 -1 -101 vhcurveto + endchar + + + -288 246 -163 rmoveto + -129 25 -7 243 169 vvcurveto + 151 9 254 127 32 vhcurveto + 27 vlineto + -104 -18 -45 -114 -19 -96 rrcurveto + -15 -75 -5 -78 -77 vvcurveto + -81 4 -81 14 -80 vhcurveto + 17 -95 48 -121 105 -9 rrcurveto + endchar + + + 121 244 33 rmoveto + -16 -15 5 9 -15 hvcurveto + 9 -15 -10 5 -6 hhcurveto + -7 -7 -1 -4 -4 hvcurveto + 5 -9 rlineto + 1 2 2 1 2 hhcurveto + 13 8 -13 -11 7 hvcurveto + -27 17 24 -24 25 hhcurveto + 23 16 11 23 9 hvcurveto + 2 -1 rlineto + -7 -15 -3 -16 -16 vvcurveto + -26 17 -30 34 -34 vhcurveto + 7 -7 10 -9 12 -11 27 -25 rcurveline + 12 -11 8 -10 4 -8 rrcurveto + -12 -3 -6 -6 -10 vvcurveto + -12 7 -7 13 13 6 7 13 9 -6 12 -11 17 vhcurveto + -17 23 -11 19 -7 13 rrcurveto + -30 56 -16 67 77 vvcurveto + 76 -23 44 -47 11 vhcurveto + 1 vlineto + 47 11 23 44 76 vvcurveto + 77 16 68 30 56 vhcurveto + 7 13 11 19 17 23 rrcurveto + 11 17 6 12 9 vvcurveto + 13 -6 6 -13 -13 -7 -6 -12 -10 6 -6 12 -3 vhcurveto + -4 -8 -8 -10 -12 -11 -27 -26 rcurveline + -12 -11 -10 -9 -7 -7 rrcurveto + -34 -34 -17 -30 -26 vvcurveto + -16 3 -15 7 -15 vhcurveto + -2 -2 rlineto + 23 -9 -16 12 -23 hhcurveto + -20 -19 -13 -25 -18 hvcurveto + -11 -9 -10 -26 -18 hhcurveto + -2 -2 0 1 -2 hvcurveto + -5 -8 rlineto + -4 4 7 -1 7 hhcurveto + 6 10 5 9 15 hvcurveto + 9 15 15 5 16 hhcurveto + 45 33 -30 -45 -26 -10 -23 -21 -19 hvcurveto + -4 2 rlineto + 3 4 2 5 6 vvcurveto + 16 -11 11 -21 6 vhcurveto + -26 7 -14 16 22 vvcurveto + 8 2 8 3 9 vhcurveto + -8 4 rlineto + -30 -28 -15 -30 -34 vvcurveto + 9 -9 -10 5 -12 hhcurveto + -32 -20 -22 -25 -21 hvcurveto + -10 -11 -9 -8 -10 -5 4 -10 rcurveline + 2 3 6 1 7 hhcurveto + 6 6 -4 -7 6 hvcurveto + 13 -14 6 -7 0 vvcurveto + -13 14 15 -7 16 hhcurveto + 14 10 4 8 7 hvcurveto + -34 15 -31 30 -28 vhcurveto + 8 4 rlineto + -3 9 -2 9 8 vvcurveto + 22 14 15 26 7 vhcurveto + 21 6 11 12 16 vvcurveto + 6 -2 5 -3 4 vhcurveto + 4 1 rlineto + 21 -19 10 -22 -26 vvcurveto + -45 -33 -30 -45 vhcurveto + -29 164 rmoveto + -2 vlineto + -15 -8 -10 -10 -6 -12 rrcurveto + -24 5 -12 10 16 vvcurveto + 16 12 10 24 5 vhcurveto + 6 -12 10 -10 15 -8 rrcurveto + endchar + + + -286 11 709 rmoveto + 81 -29 23 -94 15 -75 rrcurveto + 15 -77 4 -80 -78 vvcurveto + -114 2 -122 -36 -107 vhcurveto + -20 -60 -38 -26 -46 -12 rrcurveto + -24 vlineto + 179 23 11 267 171 vvcurveto + 167 -21 262 -169 35 vhcurveto + endchar + + + 121 241 359 rmoveto + 16 16 -5 -9 15 hvcurveto + -9 15 10 -5 6 hhcurveto + 7 6 1 4 4 hvcurveto + -4 8 rlineto + -1 -2 -2 0 -2 hhcurveto + -13 -9 13 11 -7 hvcurveto + 27 -17 -24 24 -25 hhcurveto + -23 -16 -12 -23 -9 hvcurveto + -2 2 rlineto + 7 15 3 15 16 vvcurveto + 26 -17 30 -34 34 vhcurveto + -7 7 -9 9 -12 11 -28 26 rcurveline + -12 11 -7 10 -4 8 rrcurveto + 12 3 5 6 10 vvcurveto + 12 -6 6 -13 -13 -7 -6 -13 -9 6 -12 11 -17 vhcurveto + 17 -23 12 -19 7 -13 rrcurveto + 30 -56 15 -68 -77 vvcurveto + -76 24 -44 47 -11 vhcurveto + -1 vlineto + -47 -11 -24 -44 -76 vvcurveto + -77 -15 -67 -30 -56 vhcurveto + -7 -13 -12 -19 -17 -23 rrcurveto + -11 -17 -6 -12 -9 vvcurveto + -13 7 -7 13 13 6 7 12 10 -5 6 -12 3 vhcurveto + 4 8 7 10 12 11 28 25 rcurveline + 12 11 9 9 7 7 rrcurveto + 34 34 17 30 26 vvcurveto + 16 -3 16 -7 15 vhcurveto + 2 1 rlineto + -23 9 16 -11 23 hhcurveto + 20 19 12 25 18 hvcurveto + 11 9 11 27 18 hhcurveto + 2 2 -1 -1 2 hvcurveto + 4 9 rlineto + 4 -4 -6 1 -7 hhcurveto + -6 -10 -5 -9 -15 hvcurveto + -9 -15 -16 -5 -16 hhcurveto + -45 -32 30 45 26 10 22 21 19 hvcurveto + 4 -1 rlineto + -3 -4 -2 -5 -6 vvcurveto + -16 11 -12 21 -6 vhcurveto + 26 -7 13 -15 -22 vvcurveto + -8 -1 -9 -3 -9 vhcurveto + 8 -4 rlineto + 30 28 14 31 34 vvcurveto + -9 9 11 -6 12 hhcurveto + 32 18 22 25 22 hvcurveto + 9 11 10 8 10 5 -4 10 rcurveline + -2 -3 -5 0 -7 hhcurveto + -6 -7 4 7 -6 hvcurveto + -18 20 rlineto + 14 -14 -15 7 -16 hhcurveto + -14 -11 -4 -8 -7 hvcurveto + 34 -14 30 -30 28 vhcurveto + -8 -4 rlineto + 3 -9 1 -8 -8 vvcurveto + -22 -13 -16 -26 -7 vhcurveto + -21 -6 -11 -11 -16 vvcurveto + -6 2 -5 3 -4 vhcurveto + -4 -2 rlineto + -21 19 -10 23 26 vvcurveto + 45 32 30 45 vhcurveto + 30 -164 rmoveto + 2 vlineto + 15 8 10 10 6 12 rrcurveto + 24 -5 11 -10 -16 vvcurveto + -16 -11 -10 -24 -5 vhcurveto + -6 12 -10 10 -15 8 rrcurveto + endchar + + + 22 100 548 rmoveto + 48 21 34 46 64 hhcurveto + 93 52 -94 -100 25 hvcurveto + -4 -4 rlineto + 10 -36 -23 3 -21 hhcurveto + -153 -74 -125 -129 -47 13 -71 34 -41 hvcurveto + -42 35 53 -9 58 hhcurveto + 42 41 18 28 33 hvcurveto + 82 69 15 113 101 vvcurveto + 158 -53 219 -175 -90 -56 -62 -82 -28 vhcurveto + 300 -430 rmoveto + -45 -15 -30 -47 -53 hhcurveto + -99 -23 124 48 91 37 129 117 27 27 -9 -11 25 hvcurveto + 8 -39 4 -40 -40 vvcurveto + -54 -7 -56 -18 -51 vhcurveto + endchar + + + 437 619 342 rmoveto + 13 -34 19 -64 -1 -23 rrcurveto + 0 -194 -97 -150 -87 -79 31 85 4 vhcurveto + 3 60 37 57 8 15 4 8 -8 5 -11 -16 rrcurveto + -54 -81 -37 -81 -55 vvcurveto + -165 178 14 11 166 205 106 108 53 vhcurveto + 60 120 -63 121 0 vvcurveto + -241 -567 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + endchar + + + 282 228 795 rmoveto + -85 -43 -83 -71 -92 vvcurveto + -71 44 -77 88 91 94 101 90 76 -73 67 -76 20 vhcurveto + 475 -18 rmoveto + -11 hlineto + -616 -746 -1 -14 28 -18 621 754 -1 13 rlineto + -545 -23 rmoveto + 85 -6 57 -67 -72 vvcurveto + -50 -14 -61 -72 -74 -41 74 63 45 14 48 45 26 vhcurveto + 446 -401 rmoveto + -85 -43 -83 -71 -92 vvcurveto + -71 44 -77 88 91 94 101 90 76 -73 67 -76 20 vhcurveto + -50 -52 rmoveto + 85 -6 57 -67 -72 vvcurveto + -50 -14 -61 -72 -74 -41 74 63 45 14 48 45 26 vhcurveto + endchar + + + 76 24 429 rmoveto + 83 -50 68 115 -83 48 rlineto + -30 -604 rmoveto + 70 32 264 544 -71 -34 rlineto + -59 -470 rmoveto + 83 -51 68 115 -83 49 rlineto + endchar + + + -273 69 52 rmoveto + -37 30 -30 37 37 30 30 37 37 -30 30 -37 -37 -30 -30 -37 vhcurveto + endchar + + + -273 69 257 rmoveto + -37 30 -30 37 37 30 30 37 37 -30 30 -37 -37 -30 -30 -37 vhcurveto + endchar + + + 99 365 -156 rmoveto + -7 49 -4 50 49 vvcurveto + 9 10 70 2 67 21 50 50 rlinecurve + 48 48 21 69 67 vvcurveto + 124 -70 90 -185 vhcurveto + -8 10 rlineto + 68 3 68 5 67 vhcurveto + -7 8 -82 -42 rlineto + 4 -56 2 -57 -57 vvcurveto + -9 -9 rlineto + -42 -83 -21 -47 -47 hvcurveto + -50 -51 -24 -70 -72 vvcurveto + -115 50 -96 197 -5 vhcurveto + 8 -9 rlineto + -57 -4 -55 -1 -57 vhcurveto + 17 -10 rlineto + 61 234 rmoveto + 392 vlineto + 9 9 47 -1 46 -7 34 -34 rlinecurve + 36 -37 11 -52 -51 vvcurveto + -105 -62 -116 -113 -7 vhcurveto + -81 400 rmoveto + -395 vlineto + -8 -9 rlineto + -110 -54 114 99 56 12 59 41 41 hvcurveto + 30 30 49 13 31 hhcurveto + endchar + + + 97 265 -197 rmoveto + 69 21 rlineto + -5 54 -3 53 54 vvcurveto + 7 8 81 11 77 28 58 58 rlinecurve + 49 49 19 69 69 vvcurveto + 96 -50 91 -111 -42 -51 -11 -37 -43 vhcurveto + -58 -50 -8 -65 -61 vvcurveto + -205 vlineto + -7 -7 rlineto + -19 -27 9 37 -37 hvcurveto + -48 47 -13 79 67 vvcurveto + 81 31 58 84 39 vhcurveto + -12 22 rlineto + -99 -29 -84 -83 -106 vvcurveto + -69 18 -60 45 -52 vhcurveto + 52 -60 50 -10 59 -6 7 -7 rcurveline + -2 -168 rlineto + 74 216 rmoveto + 232 vlineto + 91 29 69 82 82 15 -120 -28 -66 -15 -74 -45 -46 vhcurveto + -38 -39 -49 -24 -54 -2 rrcurveto + endchar + + + 51 171 460 rmoveto + -58 -61 -1 -58 -18 hvcurveto + -28 -113 21 -9 18 46 rlineto + 59 23 26 10 49 hhcurveto + 74 hlineto + -25 -112 -54 -143 -67 -116 1 -13 rcurveline + 55 -15 11 10 44 128 45 131 27 130 rlinecurve + 143 hlineto + 6 -6 rlineto + -10 -80 -6 -80 -81 vvcurveto + -45 2 -63 29 -27 vhcurveto + -12 12 22 0 19 hhcurveto + 41 41 32 28 31 hvcurveto + -10 17 -6 2 rlineto + -10 -15 -16 -6 -18 hhcurveto + -65 2 129 90 34 4 36 2 35 hvcurveto + 7 7 38 1 37 11 34 16 rlinecurve + 35 59 -8 7 rlineto + -18 -34 -38 -10 -39 hhcurveto + endchar + + + 230 356 302 rmoveto + 2 -22 3 -22 -22 vvcurveto + -81 -26 -108 -104 -83 -29 104 73 53 17 52 38 37 vhcurveto + -10 21 rlineto + -74 -51 -50 -58 -84 vvcurveto + -88 38 -114 105 73 63 39 53 49 vhcurveto + 8 -1 rlineto + -58 20 49 -37 58 hhcurveto + 134 112 176 142 161 -141 74 -207 -155 -63 -26 -26 -42 hvcurveto + -45 -28 -30 -37 -33 -39 15 -16 rcurveline + 68 68 46 40 200 hhcurveto + 87 110 -9 -61 59 hvcurveto + 51 -54 13 -46 -58 vvcurveto + -84 -38 -109 -97 -57 -45 45 63 vhcurveto + 154 vlineto + -8 12 rlineto + endchar + + + 202 392 586 rmoveto + -40 -6 rlineto + -304 -303 vlineto + -7 -40 rlineto + 310 -310 hlineto + 40 7 rlineto + 303 308 vlineto + 5 40 rlineto + -313 hlineto + endchar + + + 218 399 586 rmoveto + -40 -6 rlineto + -304 -303 vlineto + -7 -40 rlineto + 310 -271 -303 hlineto + -7 -40 rlineto + 658 hlineto + 6 40 rlineto + -314 271 308 hlineto + 5 40 rlineto + -313 hlineto + endchar + + + 159 358 -189 rmoveto + 76 35 rlineto + -7 49 -2 51 50 vvcurveto + 7 8 rlineto + 139 29 108 114 139 vvcurveto + 66 -25 64 -41 51 vhcurveto + -21 3 -44 -48 -3 -13 rlineto + 36 -39 27 -49 -54 vvcurveto + -56 -11 -53 -36 -44 vhcurveto + -14 -18 -53 -54 -63 -5 -6 7 rcurveline + 352 vlineto + 98 0 164 2 30 vhcurveto + -7 7 -80 -33 rlineto + 6 -101 6 -108 -96 vvcurveto + -315 vlineto + -7 -6 rlineto + -44 -51 23 21 -22 hvcurveto + -29 28 -12 41 80 vvcurveto + 129 vlineto + 116 -35 -2 -29 -47 -49 -35 -31 -39 vhcurveto + 17 -21 rlineto + 13 20 25 17 19 hhcurveto + 38 6 -60 -30 hvcurveto + -153 vlineto + -106 42 -64 190 vhcurveto + 7 -8 rlineto + -176 vlineto + endchar + + + -37 451 -214 rmoveto + -8 89 -4 116 122 vvcurveto + 132 4 139 10 116 vhcurveto + -21 4 -44 -59 -9 -2 rlineto + 14 -28 -40 14 -31 hhcurveto + -169 -71 -146 -139 -84 38 -109 105 63 58 28 38 51 hvcurveto + 7 -5 -3 -96 -2 -144 -3 -41 rlinecurve + 16 -16 rlineto + -8 348 rmoveto + -29 -33 -44 -21 -39 hhcurveto + -82 -32 75 83 112 34 109 113 26 23 -14 -18 18 hvcurveto + 16 -16 0 -30 -25 vvcurveto + endchar + + + 270 500 125 rmoveto + 45 65 49 148 -9 79 -7 59 -62 102 -45 -62 -27 -37 -19 -46 -22 -41 -10 -19 -1 -34 19 -9 32 -16 37 15 21 18 7 6 3 -11 1 -3 7 -21 1 -61 -1 -25 rrcurveto + -73 -67 -232 -102 -15 166 -5 52 18 62 2 45 rrcurveto + 8 -10 8 -8 -1 vhcurveto + -60 -9 -42 -27 -37 -34 -19 -47 -16 -48 -16 -49 32 43 46 33 64 10 rrcurveto + 11 2 2 -18 -9 vvcurveto + 1 -20 -3 -18 -3 -18 -48 -252 273 11 119 172 rrcurveto + endchar + + + 270 500 125 rmoveto + 45 65 49 148 -9 79 -7 59 -62 102 -45 -62 -27 -37 -14 -44 -22 -41 -10 -19 -1 -29 22 -15 25 -17 45 6 16 4 12 -17 3 -50 -1 -25 -73 -67 -232 -102 -15 166 rrcurveto + -5 52 18 62 2 45 rrcurveto + 8 -10 8 -8 -1 vhcurveto + -60 -9 -42 -27 -37 -34 -19 -47 -16 -48 -16 -49 32 43 46 33 64 10 rrcurveto + 11 2 2 -18 -9 vvcurveto + 1 -20 -3 -18 -3 -18 -48 -252 273 11 119 172 rrcurveto + endchar + + + 124 103 414 rmoveto + 4 -2 3 -4 -3 -4 -3 -6 -3 vhcurveto + -59 -111 -28 -86 -58 vvcurveto + -96 41 -53 78 -7 vhcurveto + 38 -4 42 9 44 22 107 53 52 101 30 141 18 83 -15 66 -46 47 -11 11 -28 15 -16 -18 -31 -35 -17 -50 -22 -44 -13 -25 1 -20 14 -16 17 -19 43 -2 32 8 rrcurveto + 11 -17 4 -47 -28 vvcurveto + -39 -37 -79 -40 -69 -11 -66 -11 -69 18 -11 49 rrcurveto + -2 9 -1 10 10 vvcurveto + 12 2 13 3 13 vhcurveto + 10 41 32 57 15 35 rrcurveto + 2 6 2 4 4 vvcurveto + endchar + + + 124 103 414 rmoveto + 4 -2 3 -4 -3 -4 -3 -6 -3 vhcurveto + -59 -111 -28 -86 -58 vvcurveto + -96 41 -53 78 -7 vhcurveto + 38 -4 42 9 44 22 107 53 52 101 30 141 18 83 -15 66 -46 47 -11 11 -28 15 -16 -18 -31 -35 -17 -50 -22 -44 -13 -25 1 -20 14 -16 17 -19 43 -2 32 8 rrcurveto + 11 -17 4 -47 -28 vvcurveto + -39 -37 -79 -40 -69 -11 -66 -11 -69 18 -11 49 rrcurveto + -2 9 -1 10 10 vvcurveto + 12 2 13 3 13 vhcurveto + 10 41 32 57 15 35 rrcurveto + 2 6 2 4 4 vvcurveto + endchar + + + 485 543 154 rmoveto + -80 -18 -77 -6 -73 5 -73 5 -71 32 -68 59 -27 23 -16 21 -2 19 -2 19 5 16 13 15 52 59 61 42 70 25 70 25 73 18 75 10 52 113 rcurveline + -79 -3 -79 -18 -80 -35 -80 -35 -67 -47 -53 -61 -35 -40 -24 -43 -15 -46 -37 -114 46 -76 71 -51 44 -32 65 -21 85 -11 69 -9 78 10 89 26 89 26 69 40 48 53 rrcurveto + 51 56 50 123 -46 93 -13 24 -16 20 -20 14 -20 14 -17 -4 -17 -22 -27 -37 -19 -46 -22 -41 -10 -19 -1 -33 19 -10 33 -17 38 18 19 16 5 6 8 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + -16 -14 -32 -15 -49 -18 -49 -18 -35 -12 -20 -4 rrcurveto + endchar + + + 485 543 154 rmoveto + -80 -18 -77 -6 -73 5 -73 5 -71 32 -68 59 -27 23 -16 21 -2 19 -2 19 5 16 13 15 52 59 61 42 70 25 70 25 73 18 75 10 52 113 rcurveline + -79 -3 -79 -18 -80 -35 -80 -35 -67 -47 -53 -61 -35 -40 -24 -43 -15 -46 -37 -114 46 -76 71 -51 44 -32 65 -21 85 -11 69 -9 78 10 89 26 89 26 69 40 48 53 rrcurveto + 51 56 50 123 -46 93 -13 24 -16 20 -20 14 -20 14 -17 -4 -17 -22 -27 -37 -19 -46 -22 -41 -10 -19 -1 -33 19 -10 33 -17 38 18 19 16 5 6 8 -9 8 -24 rrcurveto + 12 -36 0 0 0 vvcurveto + -16 -14 -32 -15 -49 -18 -49 -18 -35 -12 -20 -4 rrcurveto + endchar + + + -192 162 222 rmoveto + -16 12 -11 20 20 vvcurveto + 62 122 61 47 79 vhcurveto + 17 29 13 27 33 vvcurveto + 77 -53 51 -76 -79 -105 -53 -83 -26 10 -27 18 -16 vhcurveto + 67 40 rlineto + -19 15 -13 22 24 vvcurveto + 45 42 27 39 50 48 -62 -54 -113 -99 -44 -64 -83 vhcurveto + -13 -16 -13 -19 -20 vvcurveto + -30 19 -27 23 -14 vhcurveto + 46 32 rlineto + -80 -165 rmoveto + -31 25 -26 31 32 26 26 31 31 -26 26 -32 -31 -25 -26 -31 vhcurveto + endchar + + + -19 320 755 rmoveto + -6 5 1 5 -2 3 -16 28 -25 25 -40 3 -140 9 -72 -182 19 -107 19 -45 30 -35 34 -31 53 -48 47 -87 -31 -101 -2 -7 10 1 2 4 28 54 32 53 3 78 rrcurveto + -9 84 -44 52 -46 47 -30 31 -36 30 -10 50 22 17 29 9 33 -1 45 -2 34 -28 3 -44 1 -13 18 9 4 8 18 40 12 43 12 43 rrcurveto + -214 -670 rmoveto + -3 -4 0 -5 4 -3 72 -70 rcurveline + 4 -3 6 -1 3 4 88 92 rcurveline + 3 4 1 5 -4 3 -73 70 rcurveline + -4 3 -5 1 -3 -4 rrcurveto + endchar + + + -192 271 442 rmoveto + 31 -25 26 -31 -32 -26 -26 -31 -31 26 -26 32 31 25 26 31 vhcurveto + -80 -176 rmoveto + 16 -12 11 -20 -20 vvcurveto + -62 -122 -61 -47 -79 vhcurveto + -17 -29 -13 -27 -33 vvcurveto + -77 53 -51 76 79 105 53 83 26 -10 27 -18 16 vhcurveto + -67 -40 rlineto + 19 -15 13 -22 -24 vvcurveto + -45 -42 -27 -39 -50 -48 62 54 113 99 44 64 83 vhcurveto + 13 16 13 19 20 vvcurveto + 30 -19 27 -23 14 vhcurveto + -46 -32 rlineto + endchar + + + -212 118 432 rmoveto + 21 191 rlineto + 52 vlineto + 14 -19 6 -14 -25 -9 -17 -21 -24 2 -25 3 -24 vhcurveto + 20 -152 rlineto + 142 hmoveto + 19 194 rlineto + 1 15 0 16 16 vvcurveto + 13 -18 6 -11 -18 -21 -5 -19 -5 3 -24 2 -14 vhcurveto + 22 -193 rlineto + endchar + + + 80 116 137 rmoveto + -58 -61 rlineto + -20 vlineto + 42 -14 21 -26 -39 vvcurveto + -5 -48 -13 -31 -24 -14 rrcurveto + -21 vlineto + 22 22 20 38 23 hvcurveto + 23 38 12 37 35 vvcurveto + 28 -8 25 -14 21 vhcurveto + 21 -14 -15 11 -14 hhcurveto + 173 hmoveto + -59 -61 rlineto + -20 vlineto + 42 -14 21 -26 -39 vvcurveto + -5 -48 -13 -31 -24 -14 rrcurveto + -21 vlineto + 22 23 20 38 23 hvcurveto + 23 38 12 37 35 vvcurveto + 28 -8 25 -14 21 vhcurveto + 21 -14 -15 11 -14 hhcurveto + endchar + + + 80 156 496 rmoveto + 58 61 rlineto + 21 vlineto + -42 14 -21 25 39 vvcurveto + 5 48 13 31 24 14 rrcurveto + 21 vlineto + -22 -23 -19 -38 -23 hvcurveto + -23 -38 -11 -38 -35 vvcurveto + -28 8 -25 14 -21 vhcurveto + -21 14 15 -11 14 hhcurveto + 172 hmoveto + 58 61 rlineto + 21 vlineto + -42 14 -21 25 39 vvcurveto + 5 48 14 31 24 14 rrcurveto + 21 vlineto + -22 -23 -19 -38 -23 hvcurveto + -23 -38 -12 -38 -35 vvcurveto + -28 8 -25 14 -21 vhcurveto + -21 14 15 -11 14 hhcurveto + endchar + + + 80 116 770 rmoveto + -58 -61 rlineto + -21 vlineto + 42 -14 21 -25 -39 vvcurveto + -5 -48 -13 -31 -24 -14 rrcurveto + -21 vlineto + 22 22 19 38 23 hvcurveto + 23 38 12 38 35 vvcurveto + 28 -8 25 -14 21 vhcurveto + 21 -14 -15 11 -14 hhcurveto + 173 hmoveto + -59 -61 rlineto + -21 vlineto + 42 -14 21 -25 -39 vvcurveto + -5 -48 -13 -31 -24 -14 rrcurveto + -21 vlineto + 22 23 19 38 23 hvcurveto + 23 38 12 38 35 vvcurveto + 28 -8 25 -14 21 vhcurveto + 21 -14 -15 11 -14 hhcurveto + endchar + + + -93 156 496 rmoveto + 58 61 rlineto + 21 vlineto + -42 14 -21 25 39 vvcurveto + 5 48 13 31 24 14 rrcurveto + 21 vlineto + -22 -23 -19 -38 -23 hvcurveto + -23 -38 -11 -38 -35 vvcurveto + -28 8 -25 14 -21 vhcurveto + -21 14 15 -11 14 hhcurveto + endchar + + + -345 115 532 rmoveto + -9 14 -5 15 16 vvcurveto + 35 28 47 21 36 vhcurveto + -14 14 rlineto + -39 -49 -56 -68 -51 vvcurveto + -48 44 -87 30 15 33 24 18 8 -11 19 -5 8 vhcurveto + endchar + + + -93 116 770 rmoveto + -58 -61 rlineto + -21 vlineto + 42 -14 21 -25 -39 vvcurveto + -5 -48 -13 -31 -24 -14 rrcurveto + -21 vlineto + 22 22 19 38 23 hvcurveto + 23 38 12 38 35 vvcurveto + 28 -8 25 -14 21 vhcurveto + 21 -14 -15 11 -14 hhcurveto + endchar + + + -348 66 395 rmoveto + 35 53 54 54 62 vvcurveto + 42 -43 89 -28 -16 -32 -26 -15 -7 8 -16 6 -10 vhcurveto + 35 -57 rlineto + 7 -13 6 -12 -14 vvcurveto + -40 -24 -38 -24 -41 vhcurveto + endchar + + + -93 116 137 rmoveto + -58 -61 rlineto + -20 vlineto + 42 -14 21 -26 -39 vvcurveto + -5 -48 -13 -31 -24 -14 rrcurveto + -21 vlineto + 22 22 20 38 23 hvcurveto + 23 38 12 37 35 vvcurveto + 28 -8 25 -14 21 vhcurveto + 21 -14 -15 11 -14 hhcurveto + endchar + + + -335 110 436 rmoveto + 26 186 rlineto + 2 13 2 16 11 vvcurveto + 19 -9 14 -21 -19 -17 -10 -19 -13 1 -12 1 -12 vhcurveto + 18 -193 rlineto + endchar + + + -129 406 388 rmoveto + 52 -5 -25 27 -49 hhcurveto + -36 -45 -42 -28 -29 hvcurveto + -10 4 rlineto + 42 -6 -21 30 -45 hhcurveto + -41 -55 -44 -31 -39 hvcurveto + 12 -17 rlineto + 14 25 30 17 23 hhcurveto + 46 -3 -91 -78 -80 -6 -87 -6 -70 hvcurveto + 15 -9 70 21 rlineto + -2 51 -1 50 51 vvcurveto + 54 -7 83 14 33 vhcurveto + 27 11 25 35 41 hhcurveto + 33 15 -30 -28 5 hvcurveto + 12 -5 rlineto + endchar + + + 87 45 437 rmoveto + -150 121 -121 150 150 121 121 150 150 -121 121 -150 -150 -121 -121 -150 vhcurveto + 25 hmoveto + 136 110 110 136 136 110 -110 -136 -136 -110 -110 -136 -136 -110 110 136 vhcurveto + 257 -1 rmoveto + 72 6 57 28 70 vvcurveto + 48 -52 22 -70 vhcurveto + -162 hlineto + -4 -4 -1 -8 rlineto + 5 41 -6 -16 hvcurveto + -28 2 -50 -8 vvcurveto + -72 0 -74 -5 -72 vhcurveto + 6 -5 50 15 rlineto + -3 48 0 48 48 vvcurveto + 4 4 -2 -2 4 hvcurveto + 18 -14 75 -82 56 -60 60 13 rcurveline + 5 vlineto + -158 148 rlineto + -64 23 rmoveto + 2 2 88 2 32 vhcurveto + 10 2 3 5 vhcurveto + 24 hlineto + 44 57 -8 -50 -60 -64 -24 -66 -4 -2 4 3 hvcurveto + endchar + + + 105 448 272 rmoveto + -1 7 -9 1 -3 -8 -16 -35 -23 -28 -30 -20 -64 -43 -79 -27 -81 -25 -236 -73 96 -17 156 -4 101 -3 67 33 45 54 31 37 33 84 13 67 rrcurveto + endchar + + + 46 375 139 rmoveto + 15 8 3 31 -20 3 -7 1 -5 -3 -5 -6 rrcurveto + 1 vlineto + -13 -15 -15 -9 -18 -5 -96 -25 -110 -12 -90 -32 -9 -4 -3 -4 6 -5 8 -7 26 -10 44 -13 44 -13 27 -9 11 -2 85 -17 43 18 31 59 13 26 14 26 21 18 rrcurveto + endchar + + + 105 448 272 rmoveto + -1 7 -9 1 -3 -8 -16 -35 -23 -28 -30 -20 -64 -43 -79 -27 -81 -25 -236 -73 96 -17 156 -4 101 -3 67 33 45 54 31 37 33 84 13 67 rrcurveto + -197 -506 rmoveto + -21 37 -26 39 -32 38 -8 -14 -7 -14 -7 -15 33 -40 34 -41 18 -54 rrcurveto + -1 0 0 1 14 3 23 9 4 vhcurveto + 17 39 18 35 27 31 rrcurveto + 13 3 14 4 14 vhcurveto + -3 hlineto + -27 -35 -25 -36 -20 -42 rrcurveto + endchar + + + -61 133 -169 rmoveto + 2 4 4 8 1 vvcurveto + -20 78 -4 72 -3 80 7 1 rcurveline + -50 33 45 -28 54 hhcurveto + 120 84 136 118 58 -9 74 -40 40 hvcurveto + 36 -37 -47 18 -51 hhcurveto + -54 -57 -16 -36 -41 hvcurveto + -76 -67 3 -105 -120 vvcurveto + -105 5 -105 6 -104 vhcurveto + 20 -8 rlineto + 40 420 rmoveto + 90 28 120 111 91 20 -117 -90 -87 -41 -100 -104 -84 -21 107 77 vhcurveto + endchar + + + -45 153 575 rmoveto + -54 43 -43 54 54 43 43 54 54 -43 43 -54 -54 -43 -43 -54 vhcurveto + 30 hmoveto + 37 30 30 37 37 30 -30 -37 -37 -30 -30 -37 -37 -30 30 37 vhcurveto + endchar + + + -545 -97 575 rmoveto + -54 43 -43 54 54 43 43 54 54 -43 43 -54 -54 -43 -43 -54 vhcurveto + 30 hmoveto + 37 30 30 37 37 30 -30 -37 -37 -30 -30 -37 -37 -30 30 37 vhcurveto + endchar + + + 99 198 719 rmoveto + 8 -125 29 46 -8 125 rlineto + 82 -159 rmoveto + 13 18 18 15 -16 20 -13 16 -30 -9 -12 -11 -25 -24 -23 -25 -23 -26 -34 -6 -38 -3 -40 1 rrcurveto + -2 -2 -4 -1 2 hvcurveto + 29 -17 15 -15 25 -2 11 -1 13 1 17 4 51 13 38 21 26 35 rrcurveto + -19 9 rmoveto + 2 -3 2 -6 -4 -2 -22 -11 -27 -5 -27 -5 14 14 13 15 18 10 11 6 15 -4 5 -9 rrcurveto + 59 -490 rmoveto + 76 109 31 145 -59 124 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 -64 -59 -99 -47 -118 21 -107 46 88 134 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 rrcurveto + endchar + + + 105 334 600 rmoveto + 8 -125 29 46 -8 125 rlineto + 82 -159 rmoveto + 13 18 18 15 -16 20 -13 16 -30 -9 -12 -11 -25 -24 -23 -25 -23 -26 -34 -6 -38 -3 -40 1 rrcurveto + -2 -2 -4 -1 2 hvcurveto + 29 -17 15 -15 25 -2 11 -1 13 1 17 4 51 13 38 21 26 35 rrcurveto + -19 9 rmoveto + 2 -3 2 -6 -4 -2 -22 -11 -27 -5 -27 -5 14 14 13 15 18 10 11 6 15 -4 5 -9 rrcurveto + 22 -224 rmoveto + -1 7 -9 1 -3 -8 -16 -35 -23 -28 -30 -20 -64 -43 -79 -27 -81 -25 -236 -73 96 -17 156 -4 101 -3 67 33 45 54 31 37 33 84 13 67 rrcurveto + endchar + + + -166 342 383 rmoveto + 61 -3 -58 22 -52 hhcurveto + -83 -90 -53 -90 -66 62 -36 63 -26 hvcurveto + 47 -20 52 -27 -51 vvcurveto + -41 -43 -35 -42 -63 -47 53 62 -4 vhcurveto + -14 1 -49 -71 rlineto + -63 33 54 -20 60 hhcurveto + 88 100 53 102 47 -38 36 -77 33 hvcurveto + -73 31 -37 25 40 vvcurveto + 46 35 35 47 45 17 -34 -44 3 vhcurveto + 12 -7 rlineto + endchar + + + 517 349 126 rmoveto + 34 49 25 56 12 58 33 5 49 10 40 10 87 22 90 51 53 71 34 45 45 59 -42 50 -34 40 -77 -20 -31 -29 rrcurveto + -110 -105 -71 -86 0 vvcurveto + -59 -13 3 32 -33 73 -54 -125 rcurveline + 14 -44 13 -45 -2 -56 -64 -59 -124 -59 -93 33 -105 37 86 143 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 rrcurveto + 372 373 rmoveto + 4 -8 6 -13 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 39 -13 12 -22 rrcurveto + endchar + + + 199 550 416 rmoveto + -5 -1 -13 -2 -22 -4 -22 -4 -18 0 -16 4 -14 3 -9 9 -6 16 -6 16 -9 22 -13 28 -54 -125 rcurveline + 13 -44 13 -44 -1 -57 -32 -29 -40 -24 -48 -19 -48 -19 -54 -4 -59 11 -45 19 -15 36 15 60 11 44 30 53 16 36 8 23 -12 5 -8 -16 -64 -116 -29 -90 6 -64 rrcurveto + 6 -64 22 -42 40 -19 40 -19 47 0 56 21 56 21 46 36 37 53 35 51 23 54 12 58 76 11 76 14 74 17 74 17 63 44 52 70 17 22 16 25 14 28 rrcurveto + 14 28 -2 26 -21 25 -17 20 -25 7 -31 -6 -31 -6 -23 -10 -16 -14 -45 -45 -64 -68 -44 -48 -17 -19 -9 -10 -1 -1 rrcurveto + 235 88 rmoveto + 7 -14 -1 -8 -8 -4 -57 -27 -68 -15 -70 -14 36 37 35 38 47 26 29 16 39 -15 11 -20 rrcurveto + endchar + + + 735 293 7 rmoveto + 49 -6 57 -2 65 3 143 6 130 36 97 58 53 32 39 42 25 51 5 11 2 6 1 3 74 11 75 16 75 23 75 23 62 46 51 68 17 22 16 25 14 28 rrcurveto + 14 28 -3 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -23 -10 -16 -14 -45 -45 -64 -68 -44 -48 -17 -19 -10 -10 -1 -1 -31 -7 -82 -20 -4 46 -1 12 -2 15 -3 19 rrcurveto + -4 19 -8 1 -11 -17 -68 -102 rcurveline + 10 -28 22 -60 -2 -33 rrcurveto + 0 0 0 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -7 -72 -16 -80 -8 -80 -6 -157 -2 -120 36 -85 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 42 90 28 90 28 86 14 82 3 53 113 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -114 -57 -80 -102 -79 -101 -27 -123 92 -100 43 -47 77 -30 109 -14 rrcurveto + 1028 469 rmoveto + 7 -14 -1 -8 -8 -4 -57 -28 -67 -14 -71 -14 36 37 34 39 47 26 29 15 40 -15 11 -20 rrcurveto + endchar + + + 357 242 16 rmoveto + 13 15 1 3 16 hvcurveto + 40 6 62 17 33 9 40 15 37 18 34 22 61 39 39 50 34 66 rrcurveto + 6 11 2 11 11 vvcurveto + 37 -32 33 -38 -38 -36 -17 -16 -17 vhcurveto + -64 -60 -59 -64 -57 -67 -19 -4 -20 -3 -23 -2 -1 1 rcurveline + 14 32 10 23 5 16 rrcurveto + 1 2 0 4 6 vvcurveto + 4 0 1 -1 -1 -1 -1 -2 -2 vhcurveto + -9 -21 -14 -17 -20 -11 -29 -16 -77 -13 -124 -8 -22 -132 rcurveline + 54 5 109 20 41 17 rrcurveto + -1 -3 0 -3 -3 vvcurveto + -15 20 -2 19 vhcurveto + 331 197 rmoveto + -5 -2 -3 -4 -2 vhcurveto + -57 -28 -67 -14 -71 -14 36 36 34 41 47 25 rrcurveto + 5 8 10 1 9 hhcurveto + 29 28 -17 -25 hvcurveto + endchar + + + 414 274 37 rmoveto + -5 -15 6 -10 18 -1 60 -5 78 28 45 14 40 15 37 18 34 22 61 39 38 50 34 66 14 28 -3 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -14 rrcurveto + -64 -60 -59 -65 -57 -66 -4 -1 -9 -1 -14 -3 -21 -5 rcurveline + 15 33 9 24 5 15 rrcurveto + 1 1 0 4 6 vvcurveto + 6 -1 2 -4 -5 vhcurveto + -9 -22 -14 -16 -20 -11 -27 -15 -34 -10 -41 -3 -41 -3 -28 -3 -17 -1 rrcurveto + -1 hlineto + -55 3 -31 16 -8 28 -13 -35 -13 -44 -13 -49 1 -15 6 -11 11 -7 26 -17 27 1 46 1 48 7 72 14 37 16 rrcurveto + 349 188 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 33 38 47 26 29 15 40 -14 11 -20 rrcurveto + endchar + + + 357 262 119 rmoveto + 13 29 9 22 7 21 2 3 1 20 -7 -10 -8 -21 -16 -17 -19 -11 -38 -21 -79 -10 -43 11 -26 7 -13 33 5 30 1 3 -3 1 -3 -4 -42 -57 -33 -107 67 -33 rrcurveto + 44 -22 76 26 39 16 -12 -41 98 14 71 15 102 22 101 44 64 86 34 45 45 59 -42 50 -34 40 -78 -20 -31 -29 -64 -60 -60 -65 -57 -66 -18 -4 -37 -7 -16 8 rrcurveto + 307 91 rmoveto + 4 -8 5 -14 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 40 -12 12 -22 rrcurveto + endchar + + + 485 430 223 rmoveto + 6 -2 2 -4 -5 vhcurveto + -9 -22 -14 -17 -19 -11 -15 -8 -25 -9 -35 -10 -70 -20 -176 -33 -22 80 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 94 -9 116 28 67 28 -5 -15 9 -9 20 -2 rrcurveto + 20 -2 23 1 27 4 33 5 59 12 24 8 40 15 38 18 34 22 61 39 38 50 34 66 14 28 -3 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -14 rrcurveto + -64 -60 -59 -65 -58 -66 -13 -3 -31 -4 -11 7 6 15 5 13 5 11 rrcurveto + 6 15 8 10 19 vvcurveto + 260 5 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 38 47 26 29 15 39 -14 11 -20 rrcurveto + endchar + + + 469 439 300 rmoveto + -12 -3 -15 -2 -18 -1 -18 -1 -9 8 -1 20 -4 37 -32 12 -43 -15 -24 -8 -25 -14 -25 -17 -51 -34 -84 -75 -32 -48 -8 -10 -5 -7 -3 -4 -13 -32 -14 -63 -3 -38 rrcurveto + -6 9 0 3 3 vhcurveto + 14 22 11 19 9 16 23 39 29 32 37 28 38 28 53 41 45 10 21 5 9 -10 -3 -24 -3 -21 10 -13 20 -3 20 -3 23 1 27 5 39 7 63 21 31 9 rrcurveto + 40 15 37 18 34 22 60 39 39 51 34 65 14 28 -2 26 -21 25 -17 20 -25 7 -31 -6 -31 -6 -23 -9 -16 -15 -64 -60 -60 -65 -57 -66 rrcurveto + 241 88 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 36 34 40 47 25 29 16 39 -14 11 -21 rrcurveto + endchar + + + 611 496 315 rmoveto + -50 3 -55 -23 -62 -48 -62 -48 -44 -42 -27 -35 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 17 21 18 19 18 19 37 38 64 48 52 12 rrcurveto + 1 hlineto + 35 13 24 -7 13 -29 14 -30 60 15 32 9 52 14 51 20 52 25 81 39 52 60 41 79 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -23 -11 -16 -14 rrcurveto + -64 -60 -60 -63 -57 -67 -23 -5 -14 6 -2 17 rrcurveto + 17 -2 -12 9 -21 hhcurveto + 310 43 rmoveto + 7 -14 0 -8 -8 -4 -57 -28 -68 -14 -71 -14 36 37 34 39 47 26 29 15 40 -15 11 -20 rrcurveto + endchar + + + 417 391 221 rmoveto + -19 -4 -12 4 -4 13 -7 21 -14 7 -22 10 -9 3 -9 1 -8 1 rrcurveto + -1 hlineto + -78 -5 -60 -32 -43 -59 -43 -60 -35 -59 -27 -60 21 -2 rcurveline + 13 30 28 35 45 39 45 39 42 17 36 -7 rrcurveto + 1 vlineto + 24 1 21 -15 14 -30 14 -30 60 15 32 9 52 14 51 20 52 25 81 39 51 61 41 79 14 28 -2 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -9 -16 -15 rrcurveto + -61 -57 -59 -64 -60 -70 rrcurveto + 235 88 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -67 -15 -71 -13 27 27 0 1 27 27 18 18 22 15 23 13 29 16 39 -15 11 -20 rrcurveto + endchar + + + 620 590 306 rmoveto + -7 5 -7 8 -7 5 -20 12 -17 2 -17 -8 -44 -23 -34 -33 -38 -29 -40 -31 -80 -49 -56 -19 rrcurveto + -10 -29 -29 -5 -27 hhcurveto + -27 -20 16 32 -14 hvcurveto + -14 32 12 55 39 76 2 4 0 2 -3 1 -3 1 -2 -2 -2 -2 -11 -15 -16 -26 -21 -36 -21 -36 -15 -37 -10 -37 -8 -31 -3 -47 13 -29 rrcurveto + -35 15 25 -17 35 hhcurveto + 35 33 5 12 29 hvcurveto + 43 18 38 22 33 28 33 28 33 26 35 25 10 7 10 9 10 9 13 12 31 17 22 -14 18 -15 3 -5 36 3 26 1 26 5 25 9 75 28 71 48 55 44 rrcurveto + 38 31 27 31 17 31 13 25 11 26 9 30 9 30 -7 26 -24 21 -44 37 -75 -44 -20 -26 -53 -69 -48 -74 -46 -75 -11 -4 -12 -5 -11 -4 rrcurveto + -1 -7 -5 -2 -3 hhcurveto + 266 142 rmoveto + 9 -12 1 -10 -7 -5 -53 -37 -65 -25 -65 -24 30 43 28 43 41 33 24 18 41 -4 16 -20 rrcurveto + endchar + + + 409 142 217 rmoveto + -1 hlineto + 1 -1 -41 -29 -18 -18 -36 -54 rlinecurve + -24 -37 -16 -28 -7 -19 46 -32 rcurveline + 1 1 52 74 11 21 77 47 rlinecurve + 1 -3 rlineto + 1 0 2 1 hhcurveto + 28 10 20 -7 12 -25 4 -10 13 -5 22 1 61 3 75 24 49 14 40 15 37 17 34 22 60 39 39 51 34 65 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 rrcurveto + -31 -6 -23 -10 -16 -15 -64 -60 -60 -63 -57 -67 -18 -4 -22 -6 -19 7 rrcurveto + 15 -12 -9 27 -27 hhcurveto + -57 -45 -29 -28 -34 hvcurveto + 479 105 rmoveto + 7 -14 0 -8 -8 -4 -57 -27 -69 -14 -70 -14 27 27 1 0 27 27 18 18 22 16 23 13 29 16 39 -16 11 -20 rrcurveto + endchar + + + 310 561 367 rmoveto + -38 -36 -17 -16 -17 hvcurveto + -64 -60 -60 -64 -57 -67 rrcurveto + -2 -8 -7 0 -7 hhcurveto + -19 -6 4 24 hvcurveto + 11 vlineto + 7 -4 2 -9 vhcurveto + -6 hlineto + -50 -5 -46 -11 -41 -18 -18 -8 -14 -14 -11 -21 -11 -21 -10 -18 -8 -18 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 30 30 51 14 51 5 rrcurveto + 1 hlineto + 3 2 -2 -2 hvcurveto + -1 vlineto + -2 -1 -2 -1 vvcurveto + -19 19 -6 19 4 3 0 1 4 vhcurveto + 5 hlineto + 61 64 14 28 67 hvcurveto + 101 42 57 61 47 91 rrcurveto + 6 11 2 11 11 vvcurveto + 36 -31 34 -38 vhcurveto + -89 -110 rmoveto + 29 29 -17 -25 -5 -3 -3 -4 -2 hvcurveto + -57 -28 -67 -14 -71 -14 36 37 34 38 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + endchar + + + 521 371 46 rmoveto + -1 -3 -1 -2 -3 vvcurveto + -13 12 -7 24 vhcurveto + 4 hlineto + 32 1 32 4 32 7 52 10 49 18 48 23 75 37 53 62 40 77 rrcurveto + 6 11 3 12 11 vvcurveto + 36 -33 33 -38 -38 -35 -17 -16 -17 vhcurveto + -64 -60 -59 -64 -58 -66 rrcurveto + -1 -1 -1 -1 hhcurveto + -1 vlineto + -1 -6 -14 -1 -10 hhcurveto + -8 -6 1 3 -5 hvcurveto + 15 33 9 23 5 15 rrcurveto + 1 2 0 4 6 vvcurveto + 4 -1 2 -1 -1 -1 -2 -2 -2 vhcurveto + -16 -38 -49 -20 -46 -12 rrcurveto + -10 -35 -68 -12 -49 hhcurveto + -10 hlineto + -30 1 -26 5 -23 10 rrcurveto + -25 11 -12 20 31 vvcurveto + 30 13 41 25 50 vhcurveto + 1 2 0 1 1 vvcurveto + 2 -1 1 -1 vhcurveto + -2 hlineto + -2 -2 -1 -2 -1 hvcurveto + -16 -22 -23 -41 -32 -62 rrcurveto + -21 -41 -11 -37 -32 vvcurveto + -80 60 -17 81 80 98 22 23 53 vhcurveto + 358 162 rmoveto + -5 -2 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 34 39 47 26 rrcurveto + 5 8 10 1 9 hhcurveto + 29 28 -17 -25 hvcurveto + endchar + + + 383 358 173 rmoveto + -19 -4 -12 4 -4 13 rrcurveto + 29 -9 -24 14 -36 hhcurveto + -60 1 -49 -18 -39 -38 -39 -38 -33 -51 -26 -62 17 -23 rcurveline + 1 hlineto + 24 36 27 28 30 18 30 18 30 9 30 -1 27 -1 20 -16 12 -29 12 -30 63 16 31 9 52 14 51 20 52 25 81 39 51 60 41 79 14 28 -2 27 -21 25 rrcurveto + -17 20 -24 7 -31 -6 -31 -6 -23 -10 -16 -15 -64 -60 -60 -64 -57 -67 rrcurveto + 236 88 rmoveto + 7 -14 -1 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 39 47 26 29 16 40 -17 11 -19 rrcurveto + endchar + + + 1026 287 7 rmoveto + 49 -6 57 -2 65 3 143 6 130 36 97 58 53 32 39 42 25 51 5 11 2 6 1 3 59 17 62 21 67 28 99 42 58 61 46 89 14 28 -3 26 -21 25 rrcurveto + -17 20 -24 7 -31 -6 -61 -11 -5 -15 -39 -40 -36 -37 -47 -50 -34 -37 -17 -19 -10 -10 -1 -2 -29 -7 -15 5 -2 13 -2 13 -3 19 -5 26 -4 19 -7 1 -11 -17 -69 -102 rcurveline + 10 -28 23 -60 -2 -33 rrcurveto + 0 -1 0 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -7 -72 -16 -80 -8 -80 -6 -157 -2 -120 36 -85 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 42 90 28 90 28 86 14 82 3 53 113 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 rrcurveto + 960 465 rmoveto + 7 -14 0 -8 -8 -4 -57 -28 -68 -14 -71 -14 36 37 34 39 47 26 29 15 40 -15 11 -20 rrcurveto + endchar + + + -33 242 16 rmoveto + 13 15 1 3 16 hvcurveto + 40 6 62 17 33 9 40 15 37 18 34 22 61 39 39 50 34 66 rrcurveto + 6 11 2 11 11 vvcurveto + 37 -32 33 -38 -38 -36 -17 -16 -17 vhcurveto + -64 -60 -59 -64 -57 -67 -19 -4 -20 -3 -23 -2 -1 1 rcurveline + 14 32 10 23 5 16 rrcurveto + 1 2 0 4 6 vvcurveto + 4 0 1 -1 -1 -1 -1 -2 -2 vhcurveto + -9 -21 -14 -17 -20 -11 -29 -16 -77 -13 -124 -8 -22 -132 rcurveline + 54 5 109 20 41 17 rrcurveto + -1 -3 0 -3 -3 vvcurveto + -15 20 -2 19 vhcurveto + 331 197 rmoveto + -5 -2 -3 -4 -2 vhcurveto + -57 -28 -67 -14 -71 -14 36 36 34 41 47 25 rrcurveto + 5 8 10 1 9 hhcurveto + 29 28 -17 -25 hvcurveto + endchar + + + 23 274 37 rmoveto + -5 -15 6 -10 18 -1 60 -5 78 28 45 14 40 15 37 18 34 22 61 39 38 50 34 66 14 28 -3 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -14 rrcurveto + -64 -60 -59 -65 -57 -66 -4 -1 -9 -1 -14 -3 -21 -5 rcurveline + 15 33 9 24 5 15 rrcurveto + 1 1 0 4 6 vvcurveto + 6 -1 2 -4 -5 vhcurveto + -9 -22 -14 -16 -20 -11 -27 -15 -34 -10 -41 -3 -41 -3 -28 -3 -17 -1 rrcurveto + -1 hlineto + -55 3 -31 16 -8 28 -13 -35 -13 -44 -13 -49 1 -15 6 -11 11 -7 26 -17 27 1 46 1 48 7 72 14 37 16 rrcurveto + 349 188 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 33 38 47 26 29 15 40 -14 11 -20 rrcurveto + endchar + + + -31 262 119 rmoveto + 13 29 9 22 7 21 2 3 1 20 -7 -10 -8 -21 -16 -17 -19 -11 -38 -21 -79 -10 -43 11 -26 7 -13 33 5 30 1 3 -3 1 -3 -4 -42 -57 -33 -107 67 -33 rrcurveto + 44 -22 76 26 39 16 -12 -41 98 14 71 15 102 22 101 44 64 86 34 45 45 59 -42 50 -34 40 -78 -20 -31 -29 -64 -60 -60 -65 -57 -66 -18 -4 -37 -7 -16 8 rrcurveto + 307 91 rmoveto + 4 -8 5 -14 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 40 -12 12 -22 rrcurveto + endchar + + + 91 430 223 rmoveto + 6 -2 2 -4 -5 vhcurveto + -9 -22 -14 -17 -19 -11 -15 -8 -25 -9 -35 -10 -70 -20 -176 -33 -22 80 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 94 -9 116 28 67 28 -5 -15 9 -9 20 -2 rrcurveto + 20 -2 23 1 27 4 33 5 59 12 24 8 40 15 38 18 34 22 61 39 38 50 34 66 14 28 -3 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -14 rrcurveto + -64 -60 -59 -65 -58 -66 -13 -3 -31 -4 -11 7 6 15 5 13 5 11 rrcurveto + 6 15 8 10 19 vvcurveto + 260 5 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 38 47 26 29 15 39 -14 11 -20 rrcurveto + endchar + + + 75 439 300 rmoveto + -12 -3 -15 -2 -18 -1 -18 -1 -9 8 -1 20 -4 37 -32 12 -43 -15 -24 -8 -25 -14 -25 -17 -51 -34 -84 -75 -32 -48 -8 -10 -5 -7 -3 -4 -13 -32 -14 -63 -3 -38 rrcurveto + -6 9 0 3 3 vhcurveto + 14 22 11 19 9 16 23 39 29 32 37 28 38 28 53 41 45 10 21 5 9 -10 -3 -24 -3 -21 10 -13 20 -3 20 -3 23 1 27 5 39 7 63 21 31 9 rrcurveto + 40 15 37 18 34 22 60 39 39 51 34 65 14 28 -2 26 -21 25 -17 20 -25 7 -31 -6 -31 -6 -23 -9 -16 -15 -64 -60 -60 -65 -57 -66 rrcurveto + 241 88 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 36 34 40 47 25 29 16 39 -14 11 -21 rrcurveto + endchar + + + 210 496 315 rmoveto + -50 3 -55 -23 -62 -48 -62 -48 -44 -42 -27 -35 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 17 21 18 19 18 19 37 38 64 48 52 12 rrcurveto + 1 hlineto + 35 13 24 -7 13 -29 14 -30 60 15 32 9 52 14 51 20 52 25 81 39 52 60 41 79 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -23 -11 -16 -14 rrcurveto + -64 -60 -60 -63 -57 -67 -23 -5 -14 6 -2 17 rrcurveto + 17 -2 -12 9 -21 hhcurveto + 310 43 rmoveto + 7 -14 0 -8 -8 -4 -57 -28 -68 -14 -71 -14 36 37 34 39 47 26 29 15 40 -15 11 -20 rrcurveto + endchar + + + 26 391 221 rmoveto + -19 -4 -12 4 -4 13 -7 21 -14 7 -22 10 -9 3 -9 1 -8 1 rrcurveto + -1 hlineto + -78 -5 -60 -32 -43 -59 -43 -60 -35 -59 -27 -60 21 -2 rcurveline + 13 30 28 35 45 39 45 39 42 17 36 -7 rrcurveto + 1 vlineto + 24 1 21 -15 14 -30 14 -30 60 15 32 9 52 14 51 20 52 25 81 39 51 61 41 79 14 28 -2 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -9 -16 -15 rrcurveto + -61 -57 -59 -64 -60 -70 rrcurveto + 235 88 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -67 -15 -71 -13 27 27 0 1 27 27 18 18 22 15 23 13 29 16 39 -15 11 -20 rrcurveto + endchar + + + -33 242 16 rmoveto + 13 15 1 3 16 hvcurveto + 40 6 62 17 33 9 40 15 37 18 34 22 61 39 39 50 34 66 rrcurveto + 6 11 2 11 11 vvcurveto + 37 -32 33 -38 -38 -36 -17 -16 -17 vhcurveto + -64 -60 -59 -64 -57 -67 -19 -4 -20 -3 -23 -2 -1 1 rcurveline + 14 32 10 23 5 16 rrcurveto + 1 2 0 4 6 vvcurveto + 4 0 1 -1 -1 -1 -1 -2 -2 vhcurveto + -9 -21 -14 -17 -20 -11 -29 -16 -77 -13 -124 -8 -22 -132 rcurveline + 54 5 109 20 41 17 rrcurveto + -1 -3 0 -3 -3 vvcurveto + -15 20 -2 19 vhcurveto + 331 197 rmoveto + -5 -2 -3 -4 -2 vhcurveto + -57 -28 -67 -14 -71 -14 36 36 34 41 47 25 rrcurveto + 5 8 10 1 9 hhcurveto + 29 28 -17 -25 hvcurveto + endchar + + + 277 590 306 rmoveto + -7 5 -7 8 -7 5 -20 12 -17 2 -17 -8 -44 -23 -34 -33 -38 -29 -40 -31 -80 -49 -56 -19 rrcurveto + -10 -29 -29 -5 -27 hhcurveto + -27 -20 16 32 -14 hvcurveto + -14 32 12 55 39 76 2 4 0 2 -3 1 -3 1 -2 -2 -2 -2 -11 -15 -16 -26 -21 -36 -21 -36 -15 -37 -10 -37 -8 -31 -3 -47 13 -29 rrcurveto + -35 15 25 -17 35 hhcurveto + 35 33 5 12 29 hvcurveto + 43 18 38 22 33 28 33 28 33 26 35 25 10 7 10 9 10 9 13 12 31 17 22 -14 18 -15 3 -5 36 3 26 1 26 5 25 9 75 28 71 48 55 44 rrcurveto + 38 31 27 31 17 31 13 25 11 26 9 30 9 30 -7 26 -24 21 -44 37 -75 -44 -20 -26 -53 -69 -48 -74 -46 -75 -11 -4 -12 -5 -11 -4 rrcurveto + -1 -7 -5 -2 -3 hhcurveto + 266 142 rmoveto + 9 -12 1 -10 -7 -5 -53 -37 -65 -25 -65 -24 30 43 28 43 41 33 24 18 41 -4 16 -20 rrcurveto + endchar + + + 21 251 121 rmoveto + 4 -10 13 -5 22 1 60 3 77 21 47 16 40 15 37 18 34 22 61 39 38 51 34 65 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -23 -11 -16 -14 rrcurveto + -64 -60 -60 -64 -57 -67 -18 -4 -22 -6 -19 7 rrcurveto + 15 -12 -9 28 -27 hhcurveto + -56 -1 -45 -28 -35 -28 rrcurveto + -1 hlineto + 1 -1 -9 -6 -10 -8 -11 -9 rlinecurve + -19 -16 -22 -26 -24 -37 -24 -37 -16 -28 -7 -19 46 -32 rcurveline + 1 1 52 74 11 21 77 47 rlinecurve + 1 -2 rlineto + 0 1 0 1 1 vhcurveto + 28 10 21 -6 12 -25 rrcurveto + 370 203 rmoveto + 7 -14 0 -8 -8 -4 -57 -28 -68 -14 -71 -14 36 37 35 39 47 26 29 16 39 -16 11 -20 rrcurveto + endchar + + + -75 561 367 rmoveto + -38 -36 -17 -16 -17 hvcurveto + -64 -60 -60 -64 -57 -67 rrcurveto + -2 -8 -7 0 -7 hhcurveto + -19 -6 4 24 hvcurveto + 11 vlineto + 7 -4 2 -9 vhcurveto + -6 hlineto + -50 -5 -46 -11 -41 -18 -18 -8 -14 -14 -11 -21 -11 -21 -10 -18 -8 -18 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 30 30 51 14 51 5 rrcurveto + 1 hlineto + 3 2 -2 -2 hvcurveto + -1 vlineto + -2 -1 -2 -1 vvcurveto + -19 19 -6 19 4 3 0 1 4 vhcurveto + 5 hlineto + 61 64 14 28 67 hvcurveto + 101 42 57 61 47 91 rrcurveto + 6 11 2 11 11 vvcurveto + 36 -31 34 -38 vhcurveto + -89 -110 rmoveto + 29 29 -17 -25 -5 -3 -3 -4 -2 hvcurveto + -57 -28 -67 -14 -71 -14 36 37 34 38 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + endchar + + + 112 371 46 rmoveto + -1 -3 -1 -2 -3 vvcurveto + -13 12 -7 24 vhcurveto + 4 hlineto + 32 1 32 4 32 7 52 10 49 18 48 23 75 37 53 62 40 77 rrcurveto + 6 11 3 12 11 vvcurveto + 36 -33 33 -38 -38 -35 -17 -16 -17 vhcurveto + -64 -60 -59 -64 -58 -66 rrcurveto + -1 -1 -1 -1 hhcurveto + -1 vlineto + -1 -6 -14 -1 -10 hhcurveto + -8 -6 1 3 -5 hvcurveto + 15 33 9 23 5 15 rrcurveto + 1 2 0 4 6 vvcurveto + 4 -1 2 -1 -1 -1 -2 -2 -2 vhcurveto + -16 -38 -49 -20 -46 -12 rrcurveto + -10 -35 -68 -12 -49 hhcurveto + -10 hlineto + -30 1 -26 5 -23 10 rrcurveto + -25 11 -12 20 31 vvcurveto + 30 13 41 25 50 vhcurveto + 1 2 0 1 1 vvcurveto + 2 -1 1 -1 vhcurveto + -2 hlineto + -2 -2 -1 -2 -1 hvcurveto + -16 -22 -23 -41 -32 -62 rrcurveto + -21 -41 -11 -37 -32 vvcurveto + -80 60 -17 81 80 98 22 23 53 vhcurveto + 358 162 rmoveto + -5 -2 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 34 39 47 26 rrcurveto + 5 8 10 1 9 hhcurveto + 29 28 -17 -25 hvcurveto + endchar + + + -7 358 173 rmoveto + -19 -4 -12 4 -4 13 rrcurveto + 29 -9 -24 14 -36 hhcurveto + -60 1 -49 -18 -39 -38 -39 -38 -33 -51 -26 -62 17 -23 rcurveline + 1 hlineto + 24 36 27 28 30 18 30 18 30 9 30 -1 27 -1 20 -16 12 -29 12 -30 63 16 31 9 52 14 51 20 52 25 81 39 51 60 41 79 14 28 -2 27 -21 25 rrcurveto + -17 20 -24 7 -31 -6 -31 -6 -23 -10 -16 -15 -64 -60 -60 -64 -57 -67 rrcurveto + 236 88 rmoveto + 7 -14 -1 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 39 47 26 29 16 40 -17 11 -19 rrcurveto + endchar + + + -80 35 23 rmoveto + -99 9 91 -31 81 hhcurveto + 99 81 83 99 26 -5 27 -13 21 hvcurveto + 33 37 19 48 51 vvcurveto + 86 -87 24 -63 36 vhcurveto + -75 43 -60 13 74 vvcurveto + 58 32 52 51 44 24 -36 -60 vhcurveto + 15 -11 59 21 rlineto + 2 12 4 18 7 vvcurveto + 61 -69 18 -49 -102 -68 -79 -97 -21 4 -20 6 -20 vhcurveto + -26 -38 -22 -42 -46 vvcurveto + -86 58 -38 86 -38 vhcurveto + 82 -40 60 -26 -62 vvcurveto + -69 -43 -60 -62 -71 -45 58 68 -2 vhcurveto + -8 5 rlineto + 259 116 rmoveto + -64 66 -211 33 108 vvcurveto + 24 10 27 14 18 vhcurveto + 41 -56 144 -28 51 -53 rrcurveto + 20 -20 16 -24 -29 vvcurveto + -22 -5 -22 -13 -18 vhcurveto + endchar + + + 569 426 289 rmoveto + 41 14 106 30 126 23 97 44 rlinecurve + -7 -20 -12 -18 -6 -20 -3 -9 -4 -13 8 -6 8 -6 10 5 4 8 35 75 32 79 27 82 1 3 -5 3 -2 -3 -13 -22 -26 -12 -26 -11 -105 -42 -125 -24 -123 -26 rrcurveto + -42 -9 -2 42 -23 47 -53 -132 rcurveline + 15 -47 10 -41 -1 -50 -64 -59 -99 -46 -118 21 -107 46 88 134 31 69 9 24 -13 3 -8 -16 -256 -466 372 -28 146 211 42 61 10 35 25 67 rrcurveto + endchar + + + 143 606 361 rmoveto + 33 43 11 65 7 67 rrcurveto + 2 -3 0 -1 -7 vhcurveto + -11 -44 -33 -29 -49 -9 4 16 3 20 -1 17 rrcurveto + 8 -2 -4 -2 -3 vhcurveto + -8 -14 -5 -20 -13 -10 -118 -74 11 54 -31 65 -53 -132 rcurveline + 15 -47 10 -41 -1 -50 -64 -59 -99 -47 -118 21 -107 46 88 134 31 69 9 24 -13 4 -8 -16 -256 -466 372 -29 146 211 42 61 10 36 25 67 49 16 14 9 8 5 rrcurveto + 2 -8 5 1 5 1 40 10 35 10 21 27 rrcurveto + endchar + + + 678 961 248 rmoveto + 18 6 18 8 19 9 rrcurveto + 5 9 5 2 2 hhcurveto + -5 1 3 -2 5 hhcurveto + 29 57 31 17 13 hvcurveto + 33 42 12 65 7 68 -2 7 -2 -2 -1 -10 -12 -46 -30 -27 -50 -9 5 19 2 17 -1 17 rrcurveto + 6 -2 1 -3 -6 vhcurveto + -8 -14 -5 -20 -12 -10 -20 -15 -31 -17 -33 -2 rrcurveto + -1 vlineto + -17 1 -9 9 -1 17 -1 17 -1 15 -2 12 -4 19 -7 1 -11 -17 -69 -102 rcurveline + 10 -28 23 -60 -2 -33 rrcurveto + 0 -1 0 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -7 -72 -16 -80 -8 -80 -6 -157 -2 -120 36 -85 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 42 90 28 90 28 86 14 82 3 53 113 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 49 -6 57 -2 65 3 143 6 130 36 97 58 53 32 39 42 25 51 rrcurveto + 5 11 2 6 1 3 6 1 rcurveline + endchar + + + 321 652 304 rmoveto + 1 2 -5 4 -2 -2 -14 -22 -25 -14 -26 -10 -41 -16 -55 -16 -70 -15 -137 -30 -116 -25 -141 -25 -21 -135 rcurveline + 231 50 106 30 130 25 94 42 rlinecurve + -4 -10 -5 -10 -5 -9 -4 -8 -20 -39 13 -9 9 -7 7 2 6 12 35 75 32 78 27 82 rrcurveto + endchar + + + 361 690 274 rmoveto + 1 2 -5 4 -2 -2 -14 -22 -25 -14 -26 -10 -19 -7 -38 -12 -60 -18 -102 -30 -143 -35 -124 1 rrcurveto + -55 -31 15 29 -8 hvcurveto + -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 30 -3 38 2 48 6 48 6 49 9 52 11 93 20 111 32 74 33 -8 -19 -11 -19 -6 -20 -6 -14 0 -9 6 -4 rrcurveto + 9 -7 7 2 6 12 37 79 32 78 25 78 rrcurveto + endchar + + + 332 682 286 rmoveto + 1 4 -2 3 -3 -2 -9 -8 -7 -12 -11 -6 -104 -60 -355 -99 -106 27 -26 7 -13 34 5 31 rrcurveto + 2 -2 1 -2 -3 vhcurveto + -42 -56 -33 -110 67 -33 58 -28 282 60 212 93 -26 -59 rcurveline + -11 -25 24 -16 10 20 39 81 45 114 9 40 rrcurveto + endchar + + + 475 799 302 rmoveto + 1 -5 6 -2 -3 vhcurveto + -11 -18 -21 -15 -32 -12 -14 -6 -42 -14 -70 -21 -124 -38 -177 -43 -147 -6 -68 -3 -38 14 -9 31 -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 36 -4 49 4 61 9 rrcurveto + 61 9 62 13 65 15 103 25 135 38 80 35 -4 -10 -5 -10 -5 -9 -5 -8 -19 -39 13 -9 9 -7 7 2 6 12 35 75 32 78 27 82 rrcurveto + endchar + + + 385 713 425 rmoveto + 1 2 -6 4 -2 -2 -14 -22 -24 -14 -26 -10 -25 -10 -36 -11 -44 -11 -83 -21 -98 -24 -82 -20 -39 -10 -27 -8 -15 -7 -32 -15 -28 -19 -24 -30 -26 -33 -22 -37 -19 -40 rrcurveto + -19 -40 -10 -28 -3 -14 rrcurveto + -6 8 0 3 3 vhcurveto + 10 16 12 15 14 15 35 38 27 29 56 15 33 9 37 9 39 10 44 11 60 18 76 22 76 22 57 20 37 17 -62 -140 rcurveline + 22 18 28 62 69 149 22 68 rlinecurve + endchar + + + 525 847 435 rmoveto + 1 -5 5 -2 -3 vhcurveto + -14 -22 -24 -13 -26 -10 -63 -25 -57 -17 -51 -9 -109 -19 -85 -20 -81 -51 -42 -27 -45 -42 -47 -61 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 17 21 18 19 18 19 67 69 61 30 138 24 95 17 81 23 67 30 -4 -10 -4 -10 -5 -9 rrcurveto + -4 -8 -20 -41 12 -8 9 -7 8 3 6 12 38 81 32 78 24 76 rrcurveto + endchar + + + 226 261 188 rmoveto + 13 -22 9 -15 16 -9 23 -1 rlinecurve + 19 -2 22 6 24 14 rrcurveto + 1 3 8 6 5 hhcurveto + -4 1 3 -3 5 hhcurveto + 29 58 32 17 12 hvcurveto + 32 40 13 67 7 67 -2 7 -2 -2 -1 -10 -12 -46 -31 -27 -49 -9 5 19 2 17 -1 17 rrcurveto + 5 -2 1 -3 -5 vhcurveto + -5 -19 -11 -19 -17 -18 -19 -20 -52 -24 -15 35 -5 11 -9 10 -14 8 -62 35 -58 -39 -34 -34 -58 -58 -52 -90 -35 -77 -8 -18 -6 -12 -2 -7 -2 -7 -2 -5 -1 -1 rrcurveto + 18 hlineto + 39 61 58 85 56 38 36 24 30 1 24 -21 rrcurveto + endchar + + + 314 411 254 rmoveto + -14 -11 -22 -11 -28 -11 -28 -11 -12 10 4 33 1 7 -4 5 -9 1 -35 4 -33 -6 -32 -14 -32 -14 -29 -19 -26 -22 -19 -16 -22 -26 -24 -37 -24 -37 -16 -28 -7 -19 46 -32 rcurveline + 1 1 24 35 19 25 12 16 rlinecurve + 12 16 21 17 32 21 26 17 56 34 -6 -53 -4 -34 15 -13 32 6 32 6 23 6 15 7 rrcurveto + 5 9 6 3 2 hhcurveto + -4 1 2 -3 5 hhcurveto + 29 57 31 17 13 hvcurveto + 33 42 12 66 7 67 rrcurveto + 1 -1 1 -1 -1 vhcurveto + -1 -1 -2 -2 -3 vvcurveto + -12 -46 -31 -27 -49 -9 rrcurveto + 5 16 1 18 19 vvcurveto + -1 5 0 1 -3 -5 -8 -14 -6 -21 -12 -9 rrcurveto + endchar + + + 342 181 190 rmoveto + -6 -1 -5 -1 -6 -1 -61 -9 -40 -33 -21 -53 -7 -11 -6 -12 -6 -13 rrcurveto + -1 vlineto + -15 -18 -4 -15 9 -13 9 -13 10 2 11 17 20 20 26 12 23 4 26 5 44 8 34 11 131 27 163 43 104 46 -4 -10 -4 -10 -5 -9 -5 -8 -20 -40 13 -9 rrcurveto + 9 -7 8 3 6 12 35 75 32 78 27 82 rrcurveto + 1 -5 6 -2 -3 vhcurveto + -11 -18 -21 -15 -32 -12 -59 -24 -167 -47 -87 -18 -64 -14 -39 -8 -12 -2 rrcurveto + endchar + + + 427 749 288 rmoveto + -1 0 0 -1 -1 hvcurveto + -11 -18 -22 -15 -32 -12 -114 -45 -140 -24 -131 -28 rrcurveto + -8 -44 -38 -7 -43 hhcurveto + -57 -39 20 53 -4 hvcurveto + 5 vlineto + 28 13 40 25 51 vhcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -24 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -21 -20 vvcurveto + -55 21 -25 57 -8 vhcurveto + -3 19 18 -1 21 hhcurveto + 34 36 4 7 39 hvcurveto + 62 12 56 11 49 12 87 23 87 23 75 34 -4 -10 -5 -10 -5 -9 rrcurveto + -7 -13 -8 -18 -16 vvcurveto + -8 6 -5 7 5 4 4 7 4 vhcurveto + 38 81 32 78 24 76 rrcurveto + 1 vlineto + 1 -2 3 -2 vhcurveto + endchar + + + 181 217 135 rmoveto + 27 -36 18 -24 33 3 49 27 rlinecurve + 5 9 4 2 2 hhcurveto + -5 1 3 -2 5 hhcurveto + 29 58 32 17 13 hvcurveto + 33 42 12 65 7 68 -2 6 -2 -2 -2 -9 -11 -46 -31 -28 -50 -9 5 19 2 18 -1 17 rrcurveto + 6 -1 0 -3 -6 vhcurveto + -8 -14 -6 -21 -12 -9 -50 -38 -26 -11 -5 15 -5 15 -14 15 -22 13 -28 16 -27 2 -27 -10 -27 -10 -26 -17 -24 -24 -44 -44 -44 -71 -29 -56 rrcurveto + -2 vlineto + 9 -44 29 42 34 41 40 37 rlinecurve + 40 37 35 5 30 -27 rrcurveto + endchar + + + 1167 287 7 rmoveto + 49 -6 57 -2 65 3 143 6 130 36 97 58 53 32 39 42 25 51 5 11 2 6 1 3 85 24 rcurveline + 53 15 56 14 59 14 59 14 53 18 49 22 -4 -10 -4 -11 -5 -9 -4 -8 -21 -39 13 -9 9 -7 8 2 6 12 35 75 32 78 27 82 rrcurveto + 1 -5 6 -2 -3 vhcurveto + -11 -18 -21 -15 -32 -12 -102 -41 -164 -31 -118 -27 -27 -6 -14 7 -1 19 -1 19 -2 16 -3 14 -4 19 -7 1 -11 -17 -69 -102 rcurveline + 10 -28 23 -60 -2 -33 rrcurveto + 0 -1 0 -73 -32 vhcurveto + -49 -21 -42 -15 -36 -7 -72 -16 -80 -8 -80 -6 -157 -2 -120 36 -85 73 -32 27 -15 24 2 20 2 20 11 18 18 18 61 58 75 42 90 28 90 28 86 14 82 3 53 113 rcurveline + -79 -3 -72 -10 -64 -17 -143 -37 -114 -57 -80 -102 -79 -101 -26 -123 92 -100 43 -47 76 -30 109 -14 rrcurveto + endchar + + + -46 201 57 rmoveto + 2 -14 19 -6 16 4 21 7 16 8 17 8 rrcurveto + 2 4 7 5 5 hhcurveto + -4 1 3 -3 4 hhcurveto + 26 58 28 21 16 hvcurveto + 33 43 12 64 7 67 rrcurveto + 2 -4 0 -1 -7 vhcurveto + -11 -44 -32 -29 -49 -9 4 16 3 21 -1 17 rrcurveto + 8 -3 -5 -2 -3 vhcurveto + -8 -14 -4 -20 -13 -10 -44 -33 -38 -2 -6 1 3 13 3 13 -2 12 -1 4 -2 16 -2 -7 -22 -69 -129 -10 -52 -8 -55 -140 rcurveline + 90 29 60 5 51 23 rrcurveto + endchar + + + 52 356 166 rmoveto + 4 17 2 12 -1 8 rrcurveto + 0 -4 20 -2 -6 vhcurveto + -9 -29 -32 -23 -53 -16 -53 -16 -43 -6 -33 2 -42 2 -42 11 -9 33 -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 82 -8 102 29 58 25 2 -16 13 -6 22 6 rrcurveto + 20 6 17 8 18 8 rrcurveto + 5 9 5 3 2 hhcurveto + -4 1 3 -3 4 hhcurveto + 29 58 31 17 13 hvcurveto + 33 42 11 65 7 68 -2 7 -1 -2 -1 -10 -12 -46 -31 -27 -50 -9 5 18 2 17 -1 18 rrcurveto + 5 -1 0 -3 -4 vhcurveto + -8 -14 -6 -21 -12 -9 -20 -16 -31 -17 -34 -1 rrcurveto + endchar + + + -31 217 33 rmoveto + 2 -14 19 -6 16 4 21 7 16 7 17 8 rrcurveto + 2 4 7 6 5 hhcurveto + -4 1 3 -3 4 hhcurveto + 26 58 27 21 16 hvcurveto + 33 43 12 65 7 67 rrcurveto + 2 -4 0 -1 -7 vhcurveto + -11 -44 -32 -29 -49 -9 4 16 3 20 -1 17 rrcurveto + 8 -3 -4 -2 -3 vhcurveto + -8 -14 -4 -20 -13 -10 -21 -16 -32 -18 -33 -1 rrcurveto + -1 0 1 -1 hhcurveto + 3 13 3 12 -2 12 -1 4 -2 17 -2 -7 -18 -54 -158 -51 -36 60 rrcurveto + -7 11 -3 15 19 vvcurveto + 7 1 0 -6 -7 vhcurveto + -46 -53 -28 -110 66 -33 44 -21 95 29 39 18 rrcurveto + endchar + + + 171 476 179 rmoveto + 4 17 1 12 -1 8 rrcurveto + 0 -3 21 -2 -7 vhcurveto + -11 -34 -34 -23 -58 -13 -58 -13 -44 -8 -30 -4 -46 -6 -44 -1 -40 4 -40 4 -24 14 -7 26 -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 48 -4 58 4 69 12 rrcurveto + 53 9 90 18 44 19 2 -16 13 -6 22 6 16 5 18 8 20 10 rrcurveto + 1 3 9 6 4 hhcurveto + -4 1 2 -3 5 hhcurveto + 29 58 32 17 13 hvcurveto + 33 42 12 64 7 68 rrcurveto + 3 -4 -5 -1 -3 vhcurveto + -11 -46 -32 -27 -50 -9 5 18 3 17 -1 18 -1 6 -2 1 -2 -6 -8 -14 -5 -21 -12 -9 -20 -15 -32 -18 -34 -1 rrcurveto + endchar + + + 83 501 390 rmoveto + -4 -30 -21 -25 -39 -19 -39 -19 -21 6 -2 31 -1 17 -7 12 -12 6 -16 8 -21 -2 -26 -10 -26 -10 -26 -16 -27 -19 -46 -32 -58 -51 -33 -39 -16 -19 -17 -17 -13 -24 rrcurveto + -13 -32 -14 -63 -3 -38 rrcurveto + -6 9 0 3 3 vhcurveto + 41 66 10 26 55 51 33 29 52 40 40 21 28 15 42 16 -5 -45 -4 -33 14 -14 32 6 32 6 24 7 15 7 rrcurveto + 5 9 5 2 2 hhcurveto + -5 3 -2 5 58 39 26 52 19 vhcurveto + 19 52 12 49 5 44 -2 8 -1 -2 -2 -11 -8 -34 -37 -65 -47 17 5 19 1 18 -1 17 rrcurveto + 7 -4 -4 -3 vvcurveto + endchar + + + 245 496 315 rmoveto + -50 3 -55 -23 -62 -48 -62 -48 -44 -42 -27 -35 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 34 41 35 38 43 31 rrcurveto + 37 52 36 18 20 hhcurveto + 20 16 -6 -11 11 hvcurveto + 11 -11 14 -10 15 -9 15 -9 27 5 41 21 rrcurveto + 2 3 9 5 5 hhcurveto + -4 1 2 -2 5 hhcurveto + 29 58 31 17 13 hvcurveto + 33 42 11 65 7 68 rrcurveto + 3 -4 -5 -1 -3 vhcurveto + -12 -46 -31 -28 -49 -9 5 19 2 18 -1 17 -1 5 0 1 -3 -5 -8 -13 -5 -22 -12 -9 -10 -7 -74 -53 -15 37 rrcurveto + 1 vlineto + -1 -1 rlineto + 14 -10 -5 16 -24 hhcurveto + endchar + + + 49 261 188 rmoveto + 13 -22 9 -15 16 -9 23 -1 rlinecurve + 19 -2 22 6 24 14 rrcurveto + 1 3 8 6 5 hhcurveto + -4 1 3 -3 5 hhcurveto + 29 58 32 17 12 hvcurveto + 32 40 13 67 7 67 -2 7 -2 -2 -1 -10 -12 -46 -31 -27 -49 -9 5 19 2 17 -1 17 rrcurveto + 5 -2 1 -3 -5 vhcurveto + -5 -19 -11 -19 -17 -18 -19 -20 -52 -24 -15 35 -5 11 -9 10 -14 8 -62 35 -58 -39 -34 -34 -58 -58 -52 -90 -35 -77 -8 -18 -6 -12 -2 -7 -2 -7 -2 -5 -1 -1 rrcurveto + 18 hlineto + 39 61 58 85 56 38 36 24 30 1 24 -21 rrcurveto + endchar + + + 18 411 254 rmoveto + -14 -11 -22 -11 -28 -11 -28 -11 -12 10 4 33 1 7 -4 5 -9 1 -35 4 -33 -6 -32 -14 -32 -14 -29 -19 -26 -22 -19 -16 -22 -26 -24 -37 -24 -37 -16 -28 -7 -19 46 -32 rcurveline + 1 1 24 35 19 25 12 16 rlinecurve + 12 16 21 17 32 21 26 17 56 34 -6 -53 -4 -34 15 -13 32 6 32 6 23 6 15 7 rrcurveto + 5 9 6 3 2 hhcurveto + -4 1 2 -3 5 hhcurveto + 29 57 31 17 13 hvcurveto + 33 42 12 66 7 67 rrcurveto + 1 -1 1 -1 -1 vhcurveto + -1 -1 -2 -2 -3 vvcurveto + -12 -46 -31 -27 -49 -9 rrcurveto + 5 16 1 18 19 vvcurveto + -1 5 0 1 -3 -5 -8 -14 -6 -21 -12 -9 rrcurveto + endchar + + + -34 237 203 rmoveto + -24 -34 -7 -14 -45 hvcurveto + -52 -16 -31 -19 -11 -21 -12 -23 -7 -27 -10 -24 rrcurveto + -1 -2 -9 -14 -3 vvcurveto + -1 vlineto + -1 -4 0 -4 -3 vvcurveto + -10 6 -11 10 6 6 4 9 6 vhcurveto + 11 11 13 10 12 7 21 8 27 9 30 9 rrcurveto + 5 14 11 2 7 hhcurveto + 8 3 -3 -5 hvcurveto + -11 vlineto + -21 10 -11 20 4 4 0 1 5 vhcurveto + 32 6 24 7 15 7 rrcurveto + 5 9 4 2 2 hhcurveto + -4 1 3 -2 5 hhcurveto + 29 58 31 17 13 hvcurveto + 33 42 11 65 7 68 rrcurveto + 1 -1 0 0 -3 0 -3 -3 -1 vhcurveto + -11 -46 -31 -27 -50 -9 rrcurveto + 4 15 2 15 15 vvcurveto + 8 vlineto + 3 0 1 -1 -1 -1 -2 -2 -1 vhcurveto + -8 -14 -6 -21 -12 -9 -14 -11 -21 -11 -28 -11 rrcurveto + -3 -7 -7 -1 -5 hhcurveto + -12 -6 9 17 hvcurveto + 12 vlineto + 10 -10 2 -12 vhcurveto + endchar + + + 216 521 236 rmoveto + -1 0 -1 -1 hvcurveto + -13 -21 -24 -17 -35 -16 rrcurveto + -30 -68 -92 -22 -93 hhcurveto + -69 -55 14 65 28 13 40 26 51 hvcurveto + 1 2 0 1 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -24 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -21 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -43 9 50 -14 62 hhcurveto + 39 49 5 10 58 hvcurveto + 84 14 63 16 43 20 rrcurveto + -12 2 7 -6 13 hhcurveto + 5 5 1 1 6 hvcurveto + 17 5 18 7 19 10 rrcurveto + 5 9 5 3 2 hhcurveto + -5 1 2 -2 5 hhcurveto + 29 58 31 17 13 hvcurveto + 33 42 11 64 7 68 rrcurveto + 1 1 0 -1 vhcurveto + -1 hlineto + -1 -1 -1 -1 -1 -3 -12 -46 -32 -27 -49 -9 rrcurveto + 4 16 3 16 17 vvcurveto + 4 vlineto + 3 -1 1 -1 -1 -1 -1 -3 -1 vhcurveto + -8 -14 -5 -20 -12 -10 -20 -15 -32 -18 -34 -1 rrcurveto + -1 -1 1 0 hvcurveto + 3 15 1 11 7 vvcurveto + 4 vlineto + 0 -2 15 -2 vhcurveto + endchar + + + 6 217 135 rmoveto + 27 -36 18 -24 33 3 49 27 rlinecurve + 5 9 4 2 2 hhcurveto + -5 1 3 -2 5 hhcurveto + 29 58 32 17 13 hvcurveto + 33 42 12 65 7 68 -2 6 -2 -2 -2 -9 -11 -46 -31 -28 -50 -9 5 19 2 18 -1 17 rrcurveto + 6 -1 0 -3 -6 vhcurveto + -8 -14 -6 -21 -12 -9 -50 -38 -26 -11 -5 15 -5 15 -14 15 -22 13 -28 16 -27 2 -27 -10 -27 -10 -26 -17 -24 -24 -44 -44 -44 -71 -29 -56 rrcurveto + -2 vlineto + 9 -44 29 42 34 41 40 37 rlinecurve + 40 37 35 5 30 -27 rrcurveto + endchar + + + -352 29 400 rmoveto + -31 26 -26 32 31 25 26 31 31 -25 26 -31 -32 -26 -26 -31 vhcurveto + 41 -590 rmoveto + 40 49 50 58 61 vvcurveto + 39 -36 82 -35 -12 -11 -4 -7 -9 vhcurveto + -2 -2 rlineto + -8 -8 -1 -15 -12 vvcurveto + -9 4 -9 5 -8 vhcurveto + 34 -51 rlineto + 7 -12 6 -12 -14 vvcurveto + -36 -23 -45 -24 -32 vhcurveto + endchar + + + -86 127 229 rmoveto + 60 29 52 91 4 hvcurveto + 8 -8 6 -7 -7 vhcurveto + -103 -99 8 172 23 85 17 64 9 37 2 10 -31 -30 rcurveline + -33 -94 -28 -95 -7 -72 rrcurveto + -77 -8 32 -51 41 hhcurveto + -70 -144 rmoveto + -4 -4 0 -4 4 -4 73 -71 rcurveline + 4 -4 4 1 4 4 89 92 rcurveline + 4 4 -1 4 -4 4 -72 70 rcurveline + -4 4 -4 0 -4 -4 rrcurveto + endchar + + + -86 57 363 rmoveto + 89 -92 4 -4 4 0 4 4 rlinecurve + 72 70 4 4 1 4 -4 4 rlinecurve + -89 92 -4 4 -4 1 -4 -4 rlinecurve + -73 -71 -4 -4 0 -4 4 -4 rlinecurve + 70 -144 rmoveto + -41 -32 -51 -77 8 hvcurveto + 7 -72 28 -95 33 -94 31 -30 rcurveline + -2 10 -9 37 -17 64 -23 85 -8 172 103 -99 rrcurveto + 7 -7 8 6 8 vvcurveto + 91 -4 -29 52 -60 hhcurveto + endchar + + + -45 494 686 rmoveto + -208 hlineto + -45 -153 2 6 -18 hvcurveto + -21 -79 7 -9 rlineto + 336 hlineto + 6 -12 rlineto + -62 -99 -98 -171 0 vvcurveto + -54 -92 -85 -150 -24 -82 6 -8 rcurveline + 84 20 32 146 65 136 78 128 rlinecurve + 154 252 rlineto + endchar + + + 12 199 10 rmoveto + 15 27 2 37 8 32 32 123 34 117 50 103 rrcurveto + 48 5 46 7 41 vhcurveto + -3 1 -2 0 -1 -3 -50 -114 -47 -120 -36 -134 -36 117 -51 133 -58 121 -15 -47 -16 -48 -12 -44 65 -138 63 -136 30 -169 2 -8 11 10 3 5 rrcurveto + endchar + + + -99 140 7 rmoveto + 11 19 1 26 6 22 22 86 24 82 35 72 rrcurveto + 34 3 32 5 29 vhcurveto + -2 1 -1 0 -1 -3 -35 -79 -33 -84 -25 -94 -25 82 -36 93 -40 85 -11 -33 -11 -34 -8 -31 45 -96 44 -96 21 -118 2 -5 7 7 2 3 rrcurveto + endchar + + + -99 140 276 rmoveto + 11 19 1 26 6 22 22 86 24 82 35 72 rrcurveto + 34 3 32 5 29 vhcurveto + -2 1 -1 0 -1 -3 -35 -79 -33 -84 -25 -94 -25 82 -36 93 -40 85 -11 -33 -11 -34 -8 -31 45 -96 44 -96 21 -118 2 -5 7 7 2 3 rrcurveto + endchar + + + 12 199 10 rmoveto + 15 27 2 37 8 32 32 123 34 117 50 103 rrcurveto + 48 5 46 7 41 vhcurveto + -3 1 -2 0 -1 -3 -50 -114 -47 -120 -36 -134 -36 117 -51 133 -58 121 -15 -47 -16 -48 -12 -44 65 -138 63 -136 30 -169 2 -8 11 10 3 5 rrcurveto + endchar + + + 181 517 92 rmoveto + -134 6 -64 -3 -121 -12 96 75 265 336 -61 88 -35 -22 -41 -22 -44 -19 -18 -216 -149 -150 -101 -77 -27 -20 -33 -17 -19 -24 -4 -5 -4 -14 8 2 rrcurveto + 168 54 6 -6 153 hvcurveto + 36 28 37 34 38 32 rrcurveto + endchar + + + -99 304 64 rmoveto + -94 5 -45 -2 -84 -9 67 53 185 235 -42 61 -25 -15 -29 -15 -30 -14 -13 -151 -104 -105 -71 -54 -19 -14 -23 -12 -13 -16 -3 -4 -3 -10 6 2 rrcurveto + 117 38 4 -4 107 hvcurveto + 25 19 26 24 27 22 rrcurveto + endchar + + + -99 304 333 rmoveto + -94 5 -45 -2 -84 -9 67 53 185 235 -42 61 -25 -15 -29 -15 -30 -14 -13 -151 -104 -105 -71 -54 -19 -14 -23 -12 -13 -16 -3 -4 -3 -10 6 2 rrcurveto + 117 38 4 -4 107 hvcurveto + 25 19 26 24 27 22 rrcurveto + endchar + + + 353 404 rmoveto + 8 -140 vlineto + -31 -103 0 4 -13 hvcurveto + -14 -47 4 -5 rlineto + 228 hlineto + 5 -8 rlineto + -42 -59 -66 -103 0 vvcurveto + -37 -55 -58 -90 -16 -49 4 -5 rcurveline + 56 12 22 88 44 81 53 77 rlinecurve + endchar + + + 353 679 rmoveto + 8 -140 vlineto + -31 -103 0 4 -13 hvcurveto + -14 -47 4 -5 rlineto + 228 hlineto + 5 -8 rlineto + -42 -59 -66 -103 0 vvcurveto + -37 -55 -58 -90 -16 -49 4 -5 rcurveline + 56 12 22 88 44 81 53 77 rlinecurve + endchar + + + -12 -22 rmoveto + -15 8 13 -18 24 hhcurveto + 9 7 3 6 6 hvcurveto + 27 26 4 55 4 48 -18 -17 rcurveline + -4 vlineto + -25 -10 -26 -21 -3 vhcurveto + -2 hlineto + -7 -7 5 8 -8 hvcurveto + -8 8 -3 12 15 vvcurveto + 12 vlineto + 2 1 0 2 vvcurveto + 1 vlineto + -15 -15 -1 -20 -8 -21 -10 -12 rlinecurve + -9 -7 -17 -5 -13 hhcurveto + -18 -9 12 16 -1 hvcurveto + 5 vlineto + 14 5 14 12 vvcurveto + 1 vlineto + -8 -5 -15 -5 -2 hvcurveto + -1 -1 -1 -1 -1 -1 0 -1 vvcurveto + -4 -15 -7 -24 -20 vvcurveto + -31 12 -20 32 -2 vhcurveto + 27 3 28 21 4 26 rrcurveto + endchar + + + 636 973 504 rmoveto + 2 4 -5 -4 0 vvcurveto + -32 -28 -36 -24 -42 -16 -92 -35 -93 -34 -107 -21 -91 51 -33 -53 -49 -70 -33 -48 -31 -50 -48 -33 -18 -13 -29 4 -10 19 -21 41 9 30 -1 46 -1 32 -6 28 -20 12 rrcurveto + -14 8 -22 -12 -22 -16 -82 -60 -14 -56 -32 -94 8 7 4 7 5 8 21 34 26 33 43 14 20 7 14 -14 8 -12 18 -26 -2 -76 11 -40 8 -30 19 -22 35 -2 rrcurveto + 83 26 45 158 71 56 42 33 4 -53 45 2 125 36 115 32 101 59 -14 -33 -16 -21 -13 -33 -3 -7 7 -10 15 19 48 74 41 83 39 83 rrcurveto + endchar + + + -2 210 462 rmoveto + -126 -5 -53 -118 -118 vvcurveto + -109 46 -117 129 145 87 101 132 83 -35 70 -67 45 vhcurveto + 1 6 66 -8 69 -8 64 -13 rlinecurve + 7 6 14 57 -5 10 rlineto + -323 -47 rmoveto + 104 26 -122 -91 -69 -20 -111 -96 -60 -40 66 48 -15 hvcurveto + -11 34 -3 34 35 vvcurveto + 74 27 102 88 vhcurveto + endchar + + + -45 471 688 rmoveto + 6 -15 -25 6 -15 hhcurveto + -89 -86 -59 -65 -62 hvcurveto + -89 -89 -45 -124 -125 vvcurveto + -114 50 -137 141 120 115 107 117 85 -59 81 -91 -69 -63 -29 -43 -53 vhcurveto + -7 1 1 96 19 101 79 73 rlinecurve + 38 41 54 27 61 hhcurveto + 20 18 -3 -8 20 hvcurveto + 9 4 rlineto + -319 -369 rmoveto + 21 22 61 28 41 hhcurveto + 79 57 -68 -74 -76 -44 -64 -85 -106 -25 142 91 hvcurveto + endchar + + + 15 309 4 rmoveto + 17 38 16 41 13 41 rrcurveto + 1 -4 6 -1 1 vhcurveto + -49 98 -11 161 22 138 -99 -4 -77 25 -63 35 -11 -34 -17 -38 -13 -34 -3 -8 -2 -12 9 -5 58 -31 67 -21 88 -2 -1 -8 -1 -17 -1 -6 -14 -141 23 -126 40 -99 rrcurveto + 2 -5 10 2 2 4 rrcurveto + endchar + + + -99 214 3 rmoveto + 12 26 11 29 9 29 rrcurveto + 1 -2 4 -1 vhcurveto + -34 69 -8 113 15 96 -69 -2 -54 17 -44 25 -8 -24 -12 -27 -9 -24 -2 -5 -1 -9 6 -3 41 -22 47 -15 61 -1 rrcurveto + -6 -1 -11 -1 -5 vhcurveto + -10 -98 17 -89 28 -69 1 -3 7 1 1 3 rrcurveto + endchar + + + -99 214 272 rmoveto + 12 26 11 29 9 29 rrcurveto + 1 -2 4 -1 vhcurveto + -34 69 -8 113 15 96 -69 -2 -54 17 -44 25 -8 -24 -12 -27 -9 -24 -2 -5 -1 -9 6 -3 41 -22 47 -15 61 -1 rrcurveto + -6 -1 -11 -1 -5 vhcurveto + -10 -98 17 -89 28 -69 1 -3 7 1 1 3 rrcurveto + endchar + + + 112 377 335 rmoveto + 34 38 29 33 11 51 -38 -13 -29 -23 -36 -20 -67 -38 -68 31 -23 45 -11 22 39 83 89 -45 55 -28 24 119 -95 -6 -66 -5 -218 -220 186 -75 rrcurveto + -59 -63 -110 -131 -91 vvcurveto + 1 -1 rlineto + 4 6 9 3 2 hvcurveto + 137 198 6 4 197 123 rrcurveto + endchar + + + -99 230 234 rmoveto + 24 27 20 23 8 36 -27 -9 -20 -16 -25 -14 -47 -27 -48 22 -16 31 -8 16 28 58 62 -32 38 -19 17 83 -66 -4 -46 -4 -153 -154 130 -52 rrcurveto + -41 -44 -77 -92 -64 vvcurveto + 1 hlineto + 2 5 6 2 1 hvcurveto + 96 139 4 2 138 86 rrcurveto + endchar + + + -99 230 504 rmoveto + 24 26 20 23 8 36 -27 -9 -20 -16 -25 -14 -47 -27 -48 22 -16 31 -8 16 28 58 62 -32 38 -19 17 83 -66 -4 -46 -4 -153 -154 130 -52 rrcurveto + -41 -44 -77 -92 -64 vvcurveto + 1 hlineto + 2 5 6 2 1 hvcurveto + 96 139 4 2 138 87 rrcurveto + endchar + + + 338 413 rmoveto + 4 -10 -17 3 -10 hhcurveto + -61 -57 -35 -39 -43 hvcurveto + -60 -55 -31 -72 -76 vvcurveto + -69 34 -82 96 81 78 64 71 51 -41 48 -61 -47 -42 -17 -26 -36 vhcurveto + -5 1 1 58 13 60 53 44 rlinecurve + 23 28 37 16 41 hhcurveto + 14 12 -2 -5 13 hvcurveto + 7 2 rlineto + -217 -221 rmoveto + 13 15 41 16 28 hhcurveto + 54 38 -41 -44 -47 -31 -37 -56 -70 -19 82 58 hvcurveto + endchar + + + 338 688 rmoveto + 4 -10 -17 3 -10 hhcurveto + -61 -57 -35 -39 -43 hvcurveto + -60 -55 -31 -72 -76 vvcurveto + -69 34 -82 96 81 78 64 71 51 -41 48 -61 -47 -42 -17 -26 -36 vhcurveto + -5 1 1 58 13 60 53 44 rlinecurve + 23 28 37 16 41 hhcurveto + 14 12 -2 -5 13 hvcurveto + 7 2 rlineto + -217 -221 rmoveto + 13 15 41 16 28 hhcurveto + 54 38 -41 -44 -47 -31 -37 -56 -70 -19 82 58 hvcurveto + endchar + + + -155 380 720 rmoveto + -11 -2 -386 -888 3 -14 32 -8 389 896 -5 11 rlineto + endchar + + + -545 endchar + + + -218 endchar + + + -212 endchar + + + 104 301 134 rmoveto + 0 -50 36 -80 vhcurveto + -3 6 31 16 49 50 17 61 rlinecurve + 2 5 1 4 2 5 59 -1 36 -1 89 -3 4 48 rcurveline + -178 -6 rlineto + 134 32 -4 163 108 hhcurveto + 35 28 -29 -32 -37 13 -7 23 hvcurveto + 0 46 1 60 vvcurveto + 55 -50 23 -51 -142 -78 -109 -173 -22 vhcurveto + -2 -15 -3 -17 -3 -18 -36 3 -27 1 -43 1 -8 -45 rcurveline + 35 1 36 1 35 1 -11 -50 -17 -48 -20 -19 -31 -31 -41 -15 -22 -37 -23 -39 -12 -33 -3 -33 20 -17 rcurveline + 46 15 24 75 67 hhcurveto + 26 52 -21 -43 66 hvcurveto + -29 36 59 -29 81 hhcurveto + 43 25 25 30 29 hvcurveto + 39 41 5 57 56 vvcurveto + 11 -1 30 -4 17 vhcurveto + -24 -5 rlineto + 2 -14 2 -24 -17 vvcurveto + -67 -36 -61 -63 -44 -86 25 37 -54 vhcurveto + endchar + + + 62 11 rmoveto + -10 -12 -26 -17 -39 -19 -39 -19 -21 -12 -2 -5 10 -1 rcurveline + 83 6 58 31 30 59 rrcurveto + 9 18 5 15 12 vvcurveto + 10 -4 9 -6 6 vhcurveto + -10 10 -26 7 -43 2 rrcurveto + -18 hlineto + -32 -21 -5 -10 -8 hvcurveto + -16 -20 -12 -20 -9 -21 rrcurveto + -9 -21 -4 -12 -5 vvcurveto + 1 hlineto + 2 1 3 3 6 5 rrcurveto + 15 16 8 6 34 hhcurveto + 8 10 0 -1 10 hvcurveto + 36 -4 20 -4 6 -5 rrcurveto + endchar + + + -21 -69 rmoveto + 21 -4 18 10 15 27 21 36 3 34 -15 31 -32 66 -28 -59 -18 -43 -18 -44 -14 -44 47 -10 rrcurveto + -9 69 rmoveto + 9 4 9 9 10 vhcurveto + 9 10 11 -2 13 -11 19 -18 -3 -12 -24 -6 -24 -6 -13 3 -1 14 rrcurveto + endchar + + + -160 121 582 rmoveto + 2 -26 0 -64 -51 vvcurveto + -6 -6 rlineto + -104 hlineto + -6 -6 -7 -24 5 -5 rlineto + 112 hlineto + 6 -7 rlineto + -190 vlineto + -135 2 -19 21 -27 vhcurveto + -24 18 31 -7 23 hhcurveto + 58 60 45 43 46 hvcurveto + -7 15 -12 2 rlineto + -19 -30 -36 -22 -25 hhcurveto + -63 -8 79 71 hvcurveto + 189 vlineto + 6 6 rlineto + 119 hlineto + 6 5 8 26 -5 4 rlineto + -128 hlineto + -6 5 1 58 5 51 5 57 rlinecurve + -7 5 rlineto + endchar + + + 317 295 479 rmoveto + 22 -321 74 118 -22 321 rlineto + 212 -407 rmoveto + 34 45 46 39 -42 50 -34 40 -77 -20 -31 -29 -65 -61 -60 -65 -58 -67 -88 -15 -97 -8 -102 3 rrcurveto + -5 -4 -9 -3 5 hvcurveto + 74 -44 37 -39 65 -6 28 -3 33 4 44 11 131 34 99 53 67 90 rrcurveto + -49 22 rmoveto + 4 -8 5 -14 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 40 -12 12 -22 rrcurveto + endchar + + + -44 294 479 rmoveto + 22 -321 74 118 -22 321 rlineto + 212 -407 rmoveto + 34 45 46 39 -42 50 -34 40 -77 -20 -31 -29 -65 -61 -60 -65 -58 -67 -88 -15 -97 -8 -102 3 rrcurveto + -5 -4 -9 -3 5 hvcurveto + 74 -44 37 -39 65 -6 28 -3 33 4 44 11 131 34 99 53 67 90 rrcurveto + -49 22 rmoveto + 4 -8 5 -14 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 40 -12 12 -22 rrcurveto + endchar + + + 210 197 504 rmoveto + 21 -320 74 117 -21 321 rlineto + 198 -249 rmoveto + -38 -36 -17 -16 -17 hvcurveto + -64 -60 -59 -65 -58 -66 -27 -6 -59 -7 -90 -7 rrcurveto + -1 vlineto + -21 -128 rlineto + 2 1 0 1 2 hvcurveto + -1 vlineto + 81 8 88 17 94 28 94 28 72 47 50 67 17 22 15 25 14 28 rrcurveto + 6 11 3 11 11 vvcurveto + 36 -32 34 -38 vhcurveto + -31 -152 rmoveto + -5 -2 -4 -4 -2 vhcurveto + -57 -27 -68 -14 -70 -14 36 37 34 38 47 26 rrcurveto + 5 8 9 2 9 hhcurveto + 29 29 -17 -25 hvcurveto + endchar + + + 341 317 499 rmoveto + 22 -321 74 117 -22 321 rlineto + -352 -440 rmoveto + -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 44 -4 54 3 64 11 64 11 63 14 62 18 40 15 37 18 34 22 61 39 38 51 34 65 14 28 -3 26 -21 25 rrcurveto + -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -15 -64 -60 -59 -63 -58 -67 -34 -8 -46 -3 -36 -2 rrcurveto + -1 hlineto + -67 -6 -81 3 -14 48 rrcurveto + 515 55 rmoveto + 7 -14 -1 -8 -8 -4 -57 -27 -67 -15 -71 -13 36 36 34 40 47 25 29 16 40 -15 11 -21 rrcurveto + endchar + + + 271 251 499 rmoveto + 21 -321 74 118 -21 321 rlineto + 211 -408 rmoveto + 34 45 47 40 -42 50 -34 40 -77 -20 -31 -29 -64 -60 -60 -65 -57 -66 -76 -16 -78 3 -13 3 -29 7 -10 34 5 31 rrcurveto + 2 -2 1 -2 -3 vhcurveto + -42 -56 -34 -109 67 -33 rrcurveto + 28 -14 39 7 0 vvcurveto + 155 22 185 65 91 121 rrcurveto + -48 23 rmoveto + 4 -8 5 -14 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 40 -12 12 -22 rrcurveto + endchar + + + 401 375 514 rmoveto + 21 -321 74 117 -22 321 rlineto + 260 -352 rmoveto + 14 28 -2 26 -21 25 -17 20 -25 8 -31 -6 -31 -6 -24 -10 -15 -15 -64 -60 -60 -63 -57 -67 -38 -8 -37 -7 -39 -6 -49 -8 -47 -3 -46 3 -46 3 -26 14 -8 28 rrcurveto + -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 95 -9 212 44 71 23 46 15 42 19 40 23 67 40 43 53 36 70 rrcurveto + -97 -33 rmoveto + 7 -14 -1 -8 -8 -4 -57 -27 -66 -15 -71 -13 36 36 34 40 47 25 29 16 39 -16 11 -20 rrcurveto + endchar + + + 312 290 657 rmoveto + 22 -321 73 118 -22 321 rlineto + 206 -434 rmoveto + 17 22 16 26 17 30 17 30 -1 28 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -16 -14 -64 -60 -59 -64 -57 -67 -76 -17 -65 -35 -51 -56 -51 -56 -33 -63 -15 -70 rrcurveto + -6 9 0 3 3 vhcurveto + 35 55 40 39 49 24 96 47 107 26 100 42 50 21 43 35 37 50 rrcurveto + -43 49 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 39 47 26 29 16 39 -17 11 -19 rrcurveto + endchar + + + 402 375 628 rmoveto + 22 -320 74 117 -22 321 rlineto + 260 -352 rmoveto + 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -11 -15 -14 -60 -57 -70 -70 -52 -64 -29 -12 -32 -21 -36 -33 -36 -33 -27 -28 -19 -24 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 58 70 55 41 99 28 51 15 48 19 46 25 74 40 46 56 39 74 rrcurveto + -97 -33 rmoveto + 7 -14 -1 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 39 47 26 29 16 40 -17 11 -19 rrcurveto + endchar + + + 254 351 308 rmoveto + -18 255 -74 -110 18 -262 rlineto + 250 189 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -59 -64 -58 -66 -27 -6 -79 -10 -129 -12 rrcurveto + -1 vlineto + -21 -128 123 13 109 20 94 28 rlinecurve + 94 28 72 46 50 67 17 22 16 25 14 28 rrcurveto + 6 11 3 12 11 vvcurveto + 36 -33 33 -38 vhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 34 39 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 221 203 603 rmoveto + 21 -321 74 117 -22 321 rlineto + 260 -351 rmoveto + 14 28 -3 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -15 -60 -56 -69 -71 -52 -64 -64 -24 -42 -30 -21 -36 -21 -36 -25 -52 -30 -67 21 -2 rcurveline + 22 55 30 34 39 13 39 13 39 12 42 12 51 15 49 19 46 25 74 40 46 57 38 74 rrcurveto + -97 -34 rmoveto + 7 -14 0 -8 -8 -4 -57 -27 -67 -15 -71 -13 36 36 33 40 47 25 29 16 40 -16 11 -20 rrcurveto + endchar + + + 493 462 574 rmoveto + 21 -321 74 118 -21 320 rlineto + 258 -279 rmoveto + 9 30 -8 25 -24 21 -44 37 -74 -43 -20 -26 -53 -69 -49 -73 -45 -76 -38 -15 -47 -19 -57 -22 -57 -22 -53 -13 -49 -5 -49 -5 -37 10 -26 24 -26 24 0 51 24 78 rrcurveto + 4 1 -1 2 -3 hhcurveto + -3 -2 -1 -2 -1 hvcurveto + -8 -16 -11 -27 -14 -36 -23 -59 -22 -83 27 -65 12 -28 27 -14 43 1 45 1 56 10 67 19 138 40 141 66 106 75 86 61 32 45 30 95 rrcurveto + -90 -49 rmoveto + 10 -12 1 -9 -8 -5 -52 -37 -66 -26 -66 -24 30 43 28 44 41 32 24 18 42 -3 16 -21 rrcurveto + endchar + + + 314 209 569 rmoveto + 22 -320 74 117 -22 321 rlineto + -94 -599 rmoveto + 13 5 13 5 13 4 54 16 48 14 51 24 37 18 36 32 34 46 17 22 17 27 17 30 17 30 -2 28 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -14 rrcurveto + -64 -60 -59 -64 -58 -67 -75 -16 -81 -49 -30 -63 -6 -13 -15 -32 -3 -13 42 -29 rcurveline + 46 31 48 34 53 24 rrcurveto + 257 214 rmoveto + 7 -14 -1 -9 -8 -4 -57 -28 -66 -13 -71 -14 36 37 33 38 47 26 29 15 40 -14 11 -20 rrcurveto + endchar + + + 222 214 550 rmoveto + 22 -321 74 118 -22 321 rlineto + 198 -249 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -60 -64 -57 -66 rrcurveto + -1 vlineto + -2 -2 -35 -6 -34 -9 -32 -15 rlinecurve + -44 -20 -33 -40 -21 -48 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 28 28 39 18 42 8 64 12 66 20 68 26 68 26 54 39 39 52 13 17 12 19 13 21 rrcurveto + 10 17 6 17 17 3 -1 3 3 vvcurveto + 32 -3 -31 28 -35 hhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -28 -67 -14 -71 -14 36 37 34 39 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 538 504 530 rmoveto + 22 -321 74 117 -22 321 rlineto + 198 -249 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -60 -63 -57 -67 rrcurveto + -15 -67 -127 -32 -87 hhcurveto + -64 -46 14 35 -27 hvcurveto + -8 10 -4 13 17 vvcurveto + 28 12 37 23 46 vhcurveto + 1 2 0 0 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -49 11 61 -9 68 hhcurveto + 31 34 3 4 39 hvcurveto + 147 16 149 43 114 55 97 47 39 43 43 84 rrcurveto + 6 11 3 12 11 vvcurveto + 36 -33 33 -38 vhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 35 39 47 26 rrcurveto + 5 8 9 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 197 180 561 rmoveto + 21 -321 74 117 -21 321 rlineto + 259 -352 rmoveto + 14 28 -2 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -11 -15 -14 -60 -57 -70 -70 -52 -64 -55 -21 -39 -26 -21 -29 -21 -29 -22 -39 -22 -50 21 -11 rcurveline + 23 35 28 22 34 10 34 10 35 10 35 10 51 15 48 19 46 25 74 40 45 56 39 74 rrcurveto + -96 -33 rmoveto + 7 -14 -1 -8 -8 -4 -57 -28 -67 -14 -71 -14 36 37 34 39 47 26 29 16 40 -16 11 -20 rrcurveto + endchar + + + -158 197 504 rmoveto + 21 -320 74 117 -21 321 rlineto + 198 -249 rmoveto + -38 -36 -17 -16 -17 hvcurveto + -64 -60 -59 -65 -58 -66 -27 -6 -59 -7 -90 -7 rrcurveto + -1 vlineto + -21 -128 rlineto + 2 1 0 1 2 hvcurveto + -1 vlineto + 81 8 88 17 94 28 94 28 72 47 50 67 17 22 15 25 14 28 rrcurveto + 6 11 3 11 11 vvcurveto + 36 -32 34 -38 vhcurveto + -31 -152 rmoveto + -5 -2 -4 -4 -2 vhcurveto + -57 -27 -68 -14 -70 -14 36 37 34 38 47 26 rrcurveto + 5 8 9 2 9 hhcurveto + 29 29 -17 -25 hvcurveto + endchar + + + -37 317 499 rmoveto + 22 -321 74 117 -22 321 rlineto + -352 -440 rmoveto + -13 -34 -13 -43 -13 -51 1 -29 27 -14 28 -3 44 -4 54 3 64 11 64 11 63 14 62 18 40 15 37 18 34 22 61 39 38 51 34 65 14 28 -3 26 -21 25 rrcurveto + -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -15 -64 -60 -59 -63 -58 -67 -34 -8 -46 -3 -36 -2 rrcurveto + -1 hlineto + -67 -6 -81 3 -14 48 rrcurveto + 515 55 rmoveto + 7 -14 -1 -8 -8 -4 -57 -27 -67 -15 -71 -13 36 36 34 40 47 25 29 16 40 -15 11 -21 rrcurveto + endchar + + + -104 251 499 rmoveto + 21 -321 74 118 -21 321 rlineto + 211 -408 rmoveto + 34 45 47 40 -42 50 -34 40 -77 -20 -31 -29 -64 -60 -60 -65 -57 -66 -76 -16 -78 3 -13 3 -29 7 -10 34 5 31 rrcurveto + 2 -2 1 -2 -3 vhcurveto + -42 -56 -34 -109 67 -33 rrcurveto + 28 -14 39 7 0 vvcurveto + 155 22 185 65 91 121 rrcurveto + -48 23 rmoveto + 4 -8 5 -14 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 40 -12 12 -22 rrcurveto + endchar + + + 20 375 514 rmoveto + 21 -321 74 117 -22 321 rlineto + 260 -352 rmoveto + 14 28 -2 26 -21 25 -17 20 -25 8 -31 -6 -31 -6 -24 -10 -15 -15 -64 -60 -60 -63 -57 -67 -38 -8 -37 -7 -39 -6 -49 -8 -47 -3 -46 3 -46 3 -26 14 -8 28 rrcurveto + -13 -34 -13 -42 -13 -51 1 -29 27 -15 28 -3 95 -9 212 44 71 23 46 15 42 19 40 23 67 40 43 53 36 70 rrcurveto + -97 -33 rmoveto + 7 -14 -1 -8 -8 -4 -57 -27 -66 -15 -71 -13 36 36 34 40 47 25 29 16 39 -16 11 -20 rrcurveto + endchar + + + -65 290 657 rmoveto + 22 -321 73 118 -22 321 rlineto + 206 -434 rmoveto + 17 22 16 26 17 30 17 30 -1 28 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -16 -14 -64 -60 -59 -64 -57 -67 -76 -17 -65 -35 -51 -56 -51 -56 -33 -63 -15 -70 rrcurveto + -6 9 0 3 3 vhcurveto + 35 55 40 39 49 24 96 47 107 26 100 42 50 21 43 35 37 50 rrcurveto + -43 49 rmoveto + 7 -14 0 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 39 47 26 29 16 39 -17 11 -19 rrcurveto + endchar + + + 21 375 628 rmoveto + 22 -320 74 117 -22 321 rlineto + 260 -352 rmoveto + 14 28 -3 27 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -11 -15 -14 -60 -57 -70 -70 -52 -64 -29 -12 -32 -21 -36 -33 -36 -33 -27 -28 -19 -24 -52 -67 -42 -80 -39 -78 -9 -18 rcurveline + 4 30 rlineto + 1 vlineto + -53 -65 rlineto + -1 vlineto + -3 -38 -3 -41 1 -30 6 -17 rlinecurve + 6 -17 13 11 19 40 29 58 23 56 15 36 15 36 27 41 40 47 58 70 55 41 99 28 51 15 48 19 46 25 74 40 46 56 39 74 rrcurveto + -97 -33 rmoveto + 7 -14 -1 -9 -8 -4 -57 -27 -68 -14 -70 -14 36 37 34 39 47 26 29 16 40 -17 11 -19 rrcurveto + endchar + + + -99 351 308 rmoveto + -18 255 -74 -110 18 -262 rlineto + 250 189 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -59 -64 -58 -66 -27 -6 -79 -10 -129 -12 rrcurveto + -1 vlineto + -21 -128 123 13 109 20 94 28 rlinecurve + 94 28 72 46 50 67 17 22 16 25 14 28 rrcurveto + 6 11 3 12 11 vvcurveto + 36 -33 33 -38 vhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 34 39 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + -38 316 622 rmoveto + 22 -321 74 117 -22 321 rlineto + 260 -351 rmoveto + 14 28 -2 26 -21 25 -17 20 -25 7 -31 -6 -31 -6 -24 -10 -15 -14 -60 -57 -69 -71 -52 -64 -13 -5 -30 -8 -49 -12 -49 -12 -28 -7 -9 -6 -35 -23 -27 -28 -16 -33 rrcurveto + -16 -33 -21 -43 -24 -54 21 -2 rcurveline + 30 66 46 38 62 9 62 9 62 15 63 21 51 15 49 19 46 25 74 40 45 56 39 75 rrcurveto + -97 -34 rmoveto + 7 -14 -1 -8 -8 -4 -57 -27 -68 -15 -70 -14 36 37 35 39 47 26 29 16 39 -16 11 -20 rrcurveto + endchar + + + -158 197 504 rmoveto + 21 -320 74 117 -21 321 rlineto + 198 -249 rmoveto + -38 -36 -17 -16 -17 hvcurveto + -64 -60 -59 -65 -58 -66 -27 -6 -59 -7 -90 -7 rrcurveto + -1 vlineto + -21 -128 rlineto + 2 1 0 1 2 hvcurveto + -1 vlineto + 81 8 88 17 94 28 94 28 72 47 50 67 17 22 15 25 14 28 rrcurveto + 6 11 3 11 11 vvcurveto + 36 -32 34 -38 vhcurveto + -31 -152 rmoveto + -5 -2 -4 -4 -2 vhcurveto + -57 -27 -68 -14 -70 -14 36 37 34 38 47 26 rrcurveto + 5 8 9 2 9 hhcurveto + 29 29 -17 -25 hvcurveto + endchar + + + 125 462 574 rmoveto + 21 -321 74 118 -21 320 rlineto + 258 -279 rmoveto + 9 30 -8 25 -24 21 -44 37 -74 -43 -20 -26 -53 -69 -49 -73 -45 -76 -38 -15 -47 -19 -57 -22 -57 -22 -53 -13 -49 -5 -49 -5 -37 10 -26 24 -26 24 0 51 24 78 rrcurveto + 4 1 -1 2 -3 hhcurveto + -3 -2 -1 -2 -1 hvcurveto + -8 -16 -11 -27 -14 -36 -23 -59 -22 -83 27 -65 12 -28 27 -14 43 1 45 1 56 10 67 19 138 40 141 66 106 75 86 61 32 45 30 95 rrcurveto + -90 -49 rmoveto + 10 -12 1 -9 -8 -5 -52 -37 -66 -26 -66 -24 30 43 28 44 41 32 24 18 42 -3 16 -21 rrcurveto + endchar + + + -145 209 571 rmoveto + 22 -321 74 117 -22 321 rlineto + -94 -598 rmoveto + 13 5 13 4 13 4 54 16 48 15 51 24 37 18 36 32 35 46 17 22 16 27 17 30 17 30 -2 28 -21 25 -17 20 -24 7 -31 -6 -31 -6 -24 -10 -15 -15 rrcurveto + -64 -60 -60 -63 -57 -67 -77 -17 -78 -47 -31 -64 -6 -13 -15 -31 -3 -14 42 -30 rcurveline + 1 hlineto + 4 3 3 2 2 2 42 29 46 32 49 22 rrcurveto + 257 213 rmoveto + 7 -14 -1 -8 -8 -4 -57 -27 -66 -15 -71 -13 36 36 33 40 47 25 29 16 40 -15 11 -21 rrcurveto + endchar + + + -151 214 550 rmoveto + 22 -321 74 118 -22 321 rlineto + 198 -249 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -60 -64 -57 -66 rrcurveto + -1 vlineto + -2 -2 -35 -6 -34 -9 -32 -15 rlinecurve + -44 -20 -33 -40 -21 -48 rrcurveto + -1 vlineto + -10 -12 -5 -11 -9 vvcurveto + -10 8 -13 9 6 5 5 9 7 vhcurveto + 28 28 39 18 42 8 64 12 66 20 68 26 68 26 54 39 39 52 13 17 12 19 13 21 rrcurveto + 10 17 6 17 17 3 -1 3 3 vvcurveto + 32 -3 -31 28 -35 hhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -28 -67 -14 -71 -14 36 37 34 39 47 26 rrcurveto + 5 8 10 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 137 504 530 rmoveto + 22 -321 74 117 -22 321 rlineto + 198 -249 rmoveto + -38 -35 -17 -16 -17 hvcurveto + -64 -60 -60 -63 -57 -67 rrcurveto + -15 -67 -127 -32 -87 hhcurveto + -64 -46 14 35 -27 hvcurveto + -8 10 -4 13 17 vvcurveto + 28 12 37 23 46 vhcurveto + 1 2 0 0 1 vvcurveto + 3 -3 0 -2 -2 -1 0 -2 -1 vhcurveto + -10 -15 -15 -23 -20 -34 -20 -34 -14 -34 -11 -36 rrcurveto + -7 -22 -4 -22 -20 vvcurveto + -12 2 -11 2 -11 vhcurveto + -49 11 61 -9 68 hhcurveto + 31 34 3 4 39 hvcurveto + 147 16 149 43 114 55 97 47 39 43 43 84 rrcurveto + 6 11 3 12 11 vvcurveto + 36 -33 33 -38 vhcurveto + -30 -152 rmoveto + -5 -3 -3 -4 -2 vhcurveto + -57 -27 -68 -15 -70 -14 36 37 35 39 47 26 rrcurveto + 5 8 9 2 9 hhcurveto + 29 29 -18 -25 hvcurveto + endchar + + + 26 380 599 rmoveto + 22 -321 73 118 -21 320 rlineto + -171 -612 rmoveto + 43 8 42 10 42 14 51 15 48 20 46 25 75 41 45 54 39 74 14 28 -3 26 -21 25 -17 20 -24 7 -31 -6 -31 -6 -23 -9 -16 -15 -60 -56 -70 -72 -52 -63 rrcurveto + -27 -10 -47 -9 -35 -9 -41 -10 -39 -9 -37 -9 -37 -9 -32 -21 -27 -35 -25 -30 -15 -35 -18 -40 rrcurveto + -1 vlineto + 21 -17 17 21 20 17 23 11 rlinecurve + 57 27 76 15 69 13 rrcurveto + 334 228 rmoveto + 7 -14 -1 -9 -8 -4 -57 -27 -68 -14 -70 -14 37 36 33 40 47 25 29 16 40 -15 11 -20 rrcurveto + endchar + + + -26 143 rmoveto + 8 -125 29 46 -8 125 rlineto + 82 -159 rmoveto + 13 18 18 15 -16 20 -13 16 -30 -9 -12 -11 -25 -24 -23 -25 -23 -26 -34 -6 -38 -3 -40 1 rrcurveto + -2 -2 -4 -1 2 hvcurveto + 29 -17 15 -15 25 -2 11 -1 13 1 17 4 51 13 38 21 26 35 rrcurveto + -19 9 rmoveto + 2 -3 2 -6 -4 -2 -22 -11 -27 -5 -27 -5 14 14 13 15 18 10 11 6 15 -4 5 -9 rrcurveto + endchar + + + -59 130 461 rmoveto + -29 -39 -5 -30 -20 hvcurveto + -13 -20 -22 -102 -4 -19 22 -3 rcurveline + 13 34 17 46 13 14 rrcurveto + 20 20 37 2 28 hhcurveto + 75 hlineto + 7 -7 rlineto + -7 -83 -8 -83 -83 vvcurveto + -63 10 -88 68 43 53 38 37 39 vhcurveto + -9 14 -9 2 rlineto + -10 -16 -26 -15 -19 hhcurveto + -62 1 134 34 54 9 77 2 34 hvcurveto + 9 8 rlineto + 68 hlineto + 28 28 4 6 27 hvcurveto + 43 67 -13 9 rlineto + -16 -34 -38 -7 -38 hhcurveto + endchar + + + 319 648 -186 rmoveto + 4 4 -12 -3 -5 -1 -175 -46 -260 -39 -136 153 -78 88 247 211 55 48 40 35 43 36 32 46 27 38 64 138 -66 27 -64 27 -108 -20 -44 -31 -66 -47 -39 -153 75 -83 rrcurveto + -90 -82 -118 -209 30 -141 55 -261 426 67 163 198 rrcurveto + -446 594 rmoveto + 29 25 136 24 20 -59 -34 -32 -52 -32 -41 -30 -16 36 -27 30 -15 38 rrcurveto + 327 -358 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + endchar + + + 437 462 468 rmoveto + 60 119 -64 -12 -64 -12 -64 -12 rlinecurve + -60 -119 64 12 64 12 64 12 rlinecurve + 157 -126 rmoveto + 13 -34 19 -64 -1 -23 rrcurveto + 0 -194 -97 -150 -87 -79 31 85 4 vhcurveto + 3 60 37 57 8 15 4 8 -8 5 -11 -16 rrcurveto + -54 -81 -37 -81 -55 vvcurveto + -165 178 14 11 166 205 106 108 53 vhcurveto + 60 120 -63 121 0 vvcurveto + endchar + + + -117 210 521 rmoveto + 60 119 -64 -12 -64 -12 -64 -12 rlinecurve + -60 -119 64 12 64 12 64 12 rlinecurve + 7 -354 rmoveto + 50 226 -122 160 -114 -333 -40 -116 -21 -132 120 31 84 22 27 68 16 74 rrcurveto + -79 98 rmoveto + 13 -9 37 -78 -17 -11 -29 -18 -46 -17 -39 17 -6 3 -9 8 2 4 4 15 42 119 48 -33 rrcurveto + endchar + + + 3 312 575 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -70 -264 rmoveto + 14 -40 18 -55 -1 -26 -50 -22 -89 -24 -60 -11 -74 -133 rcurveline + 56 15 105 22 46 24 29 15 25 22 21 24 rrcurveto + 122 145 -85 158 0 vvcurveto + endchar + + + 437 544 579 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + 75 -237 rmoveto + 13 -34 19 -64 -1 -23 rrcurveto + 0 -194 -97 -150 -87 -79 31 85 4 vhcurveto + 3 60 37 57 8 15 4 8 -8 5 -11 -16 rrcurveto + -54 -81 -37 -81 -55 vvcurveto + -165 178 14 11 166 205 106 108 53 vhcurveto + 60 120 -63 121 0 vvcurveto + endchar + + + -45 214 -11 rmoveto + 109 91 99 103 32 hvcurveto + 18 56 5 61 60 vvcurveto + 134 -16 193 -153 -115 -89 -82 -108 -34 vhcurveto + -19 -58 -1 -62 -60 vvcurveto + -135 19 -201 153 vhcurveto + -95 388 rmoveto + 94 11 177 125 118 5 -167 -104 6 vhcurveto + -5 -7 rlineto + -254 hlineto + 264 -45 rmoveto + -85 -4 -109 -47 -48 vhcurveto + -19 -19 -21 -17 -27 hhcurveto + -125 -27 168 111 hvcurveto + 7 7 rlineto + 255 hlineto + endchar + + + -19 114 118 rmoveto + -76 31 -56 73 104 91 94 100 35 vhcurveto + 17 50 7 47 53 vvcurveto + 4 4 rlineto + 52 27 -53 hlineto + -4 6 rlineto + 99 -20 116 -76 76 vhcurveto + 24 -24 -32 16 -34 hhcurveto + -84 -65 -63 -84 -135 129 -72 132 -13 hvcurveto + 4 -5 rlineto + -103 -19 -189 -125 -56 -13 37 118 vhcurveto + 108 vlineto + 39 -19 36 -39 -50 -52 -35 -33 -38 vhcurveto + 11 -20 rlineto + 13 22 25 15 22 hhcurveto + 40 4 -48 -36 hvcurveto + 278 137 rmoveto + -111 10 -103 87 115 vvcurveto + 43 33 39 44 61 40 -80 -58 19 vhcurveto + 16 -49 6 -50 -52 vvcurveto + endchar + + + -2 199 -206 rmoveto + -5 52 0 13 -2 46 10 8 rcurveline + -5 19 17 -3 20 hhcurveto + 155 105 162 147 75 -35 92 -102 -69 -59 -31 -43 -54 hvcurveto + -8 4 rlineto + 10 0 28 -1 31 vhcurveto + 69 -2 -28 21 -36 hhcurveto + -44 -52 -36 -32 -40 hvcurveto + 14 -19 rlineto + 14 24 28 15 21 hhcurveto + 30 9 -52 -45 hvcurveto + -221 vlineto + -57 -1 -205 -5 -58 vhcurveto + 10 -11 rlineto + 73 219 rmoveto + 1 -1 81 82 11 2 98 6 vvcurveto + 37 47 41 21 51 hhcurveto + 64 39 -77 -87 -95 -34 -115 -121 -33 -31 15 22 -24 hvcurveto + endchar + + + -45 241 382 rmoveto + 87 25 71 65 96 vvcurveto + 87 -65 47 -81 -62 -68 -51 -43 -51 vhcurveto + 14 -22 rlineto + 24 37 46 29 39 hhcurveto + 60 49 -37 -62 -90 -70 -51 -121 -28 hvcurveto + -1 -26 rlineto + 60 79 -4 -41 39 hvcurveto + 29 -31 20 -40 -43 vvcurveto + -86 -56 -77 -90 -61 -45 47 51 -30 vhcurveto + -10 hlineto + -42 -72 7 -11 rlineto + -35 45 54 -20 57 hhcurveto + 133 132 95 137 100 -78 48 -127 11 hvcurveto + endchar + + + 50 219 4 rmoveto + 71 111 -16 143 -64 110 -4 7 19 15 10 8 5 -6 4 -6 7 -4 28 -17 35 19 17 15 41 38 11 69 6 74 1 8 -9 -18 -1 -4 -7 -36 -33 -29 -43 10 rrcurveto + -14 3 -12 17 3 21 1 3 -5 10 -3 -6 -5 -8 -7 -26 -5 -7 -21 -29 -61 -19 -37 26 -27 19 -15 39 -15 31 -19 -40 -15 -43 -15 -41 21 -52 34 -40 27 -45 rrcurveto + 52 -85 63 -99 -14 -142 rrcurveto + -2 9 4 2 4 vhcurveto + endchar + + + -99 141 3 rmoveto + 50 78 -11 100 -45 77 -3 5 14 10 7 6 3 -5 3 -4 5 -3 19 -12 25 14 12 10 28 27 8 48 4 52 1 6 -6 -13 -1 -3 -5 -25 -23 -20 -30 7 rrcurveto + -10 2 -8 12 2 14 1 3 -4 7 -2 -5 -4 -5 -4 -18 -4 -5 -15 -21 -42 -13 -26 18 -19 14 -11 27 -10 22 -13 -28 -11 -31 -10 -28 14 -37 24 -28 19 -31 rrcurveto + 36 -60 44 -69 -9 -99 rrcurveto + -2 6 3 1 3 vhcurveto + endchar + + + -99 141 272 rmoveto + 50 78 -11 100 -45 77 -3 5 14 10 7 6 3 -5 3 -4 5 -3 19 -11 25 13 12 10 28 27 8 48 4 52 1 6 -6 -13 -1 -3 -5 -25 -23 -20 -30 7 rrcurveto + -10 2 -8 12 2 14 1 3 -4 7 -2 -5 -4 -5 -4 -18 -4 -5 -15 -21 -42 -13 -26 18 -19 14 -11 27 -10 22 -13 -28 -11 -31 -10 -28 14 -37 24 -28 19 -31 rrcurveto + 36 -60 44 -69 -9 -99 rrcurveto + -2 6 3 1 3 vhcurveto + endchar + + + 182 229 rmoveto + 59 15 48 39 58 vvcurveto + 53 -46 27 -53 -42 -46 -30 -26 -35 vhcurveto + 10 -13 rlineto + 15 26 31 16 26 hhcurveto + 41 32 -22 -37 -55 -48 -29 -81 -17 hvcurveto + -1 -16 rlineto + 41 54 -2 -25 26 hvcurveto + 20 -19 13 -23 -26 vvcurveto + -53 -39 -45 -60 -41 -29 27 32 -22 vhcurveto + -7 hlineto + -28 -44 4 -6 rlineto + -21 31 37 -12 39 hhcurveto + 89 90 56 83 62 -56 26 -83 7 hvcurveto + endchar + + + 182 504 rmoveto + 59 15 48 39 58 vvcurveto + 53 -46 27 -53 -42 -46 -30 -26 -35 vhcurveto + 10 -13 rlineto + 15 26 31 16 26 hhcurveto + 41 32 -22 -37 -55 -48 -29 -81 -17 hvcurveto + -1 -16 rlineto + 41 54 -2 -25 26 hvcurveto + 20 -19 13 -23 -26 vvcurveto + -53 -39 -45 -60 -41 -29 27 32 -22 vhcurveto + -7 hlineto + -28 -44 4 -6 rlineto + -21 31 37 -12 39 hhcurveto + 89 90 56 83 62 -56 26 -83 7 hvcurveto + endchar + + + 147 74 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + endchar + + + 147 74 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + endchar + + + 245 633 704 rmoveto + -11 -1 -433 -680 rlineto + -14 vlineto + 31 -13 437 688 -3 11 rlineto + -475 -188 rmoveto + 62 15 52 39 58 vvcurveto + 53 -49 27 -56 -46 -48 -31 -25 -37 vhcurveto + 10 -13 rlineto + 14 27 32 17 29 hhcurveto + 41 37 -20 -39 -55 -51 -29 -86 -17 hvcurveto + -1 -16 rlineto + 43 58 -2 -25 28 hvcurveto + 20 -18 15 -25 -25 vvcurveto + -52 -40 -46 -65 -43 -33 28 31 -22 vhcurveto + -7 hlineto + -30 -44 4 -6 rlineto + -21 32 40 -12 41 hhcurveto + 96 94 57 82 59 -53 29 -94 7 hvcurveto + 435 -103 rmoveto + -206 -260 rlineto + -27 204 vlineto + 5 -5 rlineto + -38 1 -50 -4 -21 vhcurveto + 3 -3 58 20 rlineto + -2 13 -1 48 32 vvcurveto + 6 4 rlineto + 59 hlineto + 12 23 -3 4 rlineto + -68 hlineto + -6 5 rlineto + 93 1 164 1 16 vhcurveto + -6 3 rlineto + -55 -281 rmoveto + -155 hlineto + -3 4 1 13 60 83 27 35 rlinecurve + 21 27 21 28 25 23 rrcurveto + 1 1 1 1 2 hhcurveto + 2 1 -1 -4 hvcurveto + -205 vlineto + endchar + + + -246 144 518 rmoveto + 64 16 52 43 62 vvcurveto + 58 -50 29 -57 -46 -49 -32 -29 -38 vhcurveto + 10 -14 rlineto + 16 28 33 18 29 hhcurveto + 45 35 -24 -40 -59 -53 -33 -88 -18 hvcurveto + -17 vlineto + 44 57 -2 -27 29 hvcurveto + 21 -20 16 -26 -28 vvcurveto + -57 -42 -49 -65 -44 -32 30 34 -24 vhcurveto + -8 hlineto + -31 -47 5 -7 rlineto + -23 33 40 -13 42 hhcurveto + 96 99 61 90 67 -61 29 -90 7 hvcurveto + endchar + + + -45 249 620 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + endchar + + + -545 -2 620 rmoveto + -26 12 -31 13 -26 -4 -35 -5 -19 -58 -8 -35 14 -5 rcurveline + 12 33 10 12 24 3 17 2 18 -4 15 -7 63 -30 rcurveline + 20 -9 22 -6 22 3 32 4 20 56 3 29 -13 5 rcurveline + -9 -23 -8 -13 -24 -3 -16 -2 -16 5 -14 6 rrcurveto + endchar + + + 437 371 648 rmoveto + 8 -125 29 46 -8 125 rlineto + 82 -159 rmoveto + 13 18 18 15 -16 20 -13 16 -30 -9 -12 -11 -25 -24 -23 -25 -23 -26 -34 -6 -38 -3 -40 1 rrcurveto + -2 -2 -4 -1 2 hvcurveto + 29 -17 15 -15 25 -2 11 -1 13 1 17 4 51 13 38 21 26 35 rrcurveto + -19 9 rmoveto + 2 -3 2 -6 -4 -2 -22 -11 -27 -5 -27 -5 14 14 13 15 18 10 11 6 15 -4 5 -9 rrcurveto + 156 -202 rmoveto + 13 -34 19 -64 -1 -23 rrcurveto + 0 -194 -97 -150 -87 -79 31 85 4 vhcurveto + 3 60 37 57 8 15 4 8 -8 5 -11 -16 rrcurveto + -54 -81 -37 -81 -55 vvcurveto + -165 178 14 11 166 205 106 108 53 vhcurveto + 60 120 -63 121 0 vvcurveto + endchar + + + -45 467 88 rmoveto + -309 hlineto + -5 -8 1 6 2 1 1 1 1 hvcurveto + 84 98 88 101 59 107 rrcurveto + 26 46 22 48 54 vvcurveto + 87 -63 68 -88 -84 -73 -53 -60 -54 vhcurveto + 20 -19 rlineto + 32 38 44 32 55 hhcurveto + 85 28 -80 -52 -119 -78 -101 -78 -91 hvcurveto + -53 -62 -56 -59 -57 -58 rrcurveto + -16 437 vlineto + 23 78 rlineto + endchar + + + -78 262 571 rmoveto + 2 -2 1 0 vhcurveto + -41 10 -43 10 -48 -6 -113 -13 -8 -212 52 -89 39 -66 51 -101 -12 -107 6 4 3 5 1 5 17 64 31 63 -9 78 -22 79 -54 84 -29 72 45 13 52 -9 41 -12 rrcurveto + 5 -1 6 7 2 7 rrcurveto + endchar + + + -99 214 400 rmoveto + 1 -1 1 0 vhcurveto + -29 7 -30 7 -33 -4 -79 -9 -6 -149 36 -62 28 -46 35 -71 -8 -75 4 3 2 3 1 4 12 45 22 44 -7 54 -15 56 -38 58 -20 51 31 9 37 -6 28 -9 rrcurveto + 4 4 4 5 1 hvcurveto + endchar + + + -99 214 669 rmoveto + 1 -1 1 0 vhcurveto + -29 7 -30 7 -33 -4 -79 -9 -6 -149 36 -62 28 -46 35 -71 -8 -75 4 3 2 3 1 4 12 45 22 44 -7 54 -15 56 -38 58 -20 51 31 9 37 -6 28 -9 rrcurveto + 4 4 4 5 1 hvcurveto + endchar + + + 28 210 372 rmoveto + 57 -18 42 17 26 51 26 51 11 52 -5 56 rrcurveto + 4 -2 -1 -3 -6 vhcurveto + -3 -6 -2 -3 -2 vvcurveto + -40 -68 -49 -30 -58 7 -58 7 -45 38 -33 68 -19 -39 -16 -43 -15 -42 11 -26 13 -25 15 -21 46 -65 36 -63 37 -79 24 -52 9 -61 -7 -71 rrcurveto + -1 -3 12 9 0 vvcurveto + 35 56 16 60 -5 66 -5 66 -18 60 -32 56 rrcurveto + endchar + + + -99 142 260 rmoveto + 40 -12 29 12 18 35 19 36 7 37 -3 39 rrcurveto + 3 -2 -1 -2 -4 vhcurveto + -2 -5 -1 -2 -1 vvcurveto + -28 -48 -34 -21 -41 5 -41 5 -31 27 -23 47 -13 -27 -12 -30 -10 -29 8 -19 9 -17 10 -15 32 -45 26 -44 25 -56 17 -36 7 -43 -5 -50 rrcurveto + -1 -2 8 7 0 vvcurveto + 25 39 11 42 -3 46 -4 46 -13 42 -22 39 rrcurveto + endchar + + + -99 142 529 rmoveto + 40 -12 29 12 18 35 19 36 7 37 -3 39 rrcurveto + 3 -2 -1 -2 -4 vhcurveto + -2 -5 -1 -2 -1 vvcurveto + -28 -48 -34 -21 -41 5 -41 5 -31 27 -23 47 -13 -27 -12 -30 -10 -29 8 -19 9 -17 10 -15 32 -45 26 -44 25 -56 17 -36 7 -43 -5 -50 rrcurveto + -1 -2 8 7 0 vvcurveto + 25 39 11 42 -3 46 -4 46 -13 42 -22 39 rrcurveto + endchar + + + 338 48 rmoveto + -3 5 rlineto + -209 hlineto + -4 -5 0 4 1 0 0 1 1 hvcurveto + 82 83 107 106 84 vvcurveto + 53 -44 40 -58 -56 -50 -32 -36 -37 vhcurveto + 13 -11 rlineto + 19 26 31 19 37 hhcurveto + 56 20 -46 -33 -72 -53 -60 -53 -55 hvcurveto + -36 -37 -38 -35 -38 -35 rrcurveto + -10 296 vlineto + endchar + + + 338 323 rmoveto + -3 5 rlineto + -209 hlineto + -4 -5 0 4 1 0 0 1 1 hvcurveto + 82 83 107 106 84 vvcurveto + 53 -44 40 -58 -56 -50 -32 -36 -37 vhcurveto + 13 -11 rlineto + 19 26 31 19 37 hhcurveto + 56 20 -46 -33 -72 -53 -60 -53 -55 hvcurveto + -36 -37 -38 -35 -38 -35 rrcurveto + -10 296 vlineto + endchar + + + 65 -37 rmoveto + 60 119 -64 -12 -64 -12 -64 -12 rlinecurve + -60 -119 64 12 64 12 64 12 rlinecurve + endchar + + + 65 -37 rmoveto + 60 119 -64 -12 -64 -12 -64 -12 rlinecurve + -60 -119 64 12 64 12 64 12 rlinecurve + endchar + + + -241 308 327 rmoveto + -227 hlineto + -5 -4 1 4 1 0 0 1 1 hvcurveto + 88 90 117 114 91 vvcurveto + 58 -48 43 -63 -61 -54 -34 -39 -40 vhcurveto + 14 -13 rlineto + 21 28 34 21 40 hhcurveto + 60 22 -50 -36 -78 -57 -65 -57 -59 hvcurveto + -39 -40 -41 -38 -42 -38 rrcurveto + -11 321 vlineto + 17 51 rlineto + endchar + + + 93 627 107 rmoveto + -19 -26 -34 -23 -27 hhcurveto + -49 0 55 61 92 4 93 8 93 hvcurveto + -13 11 -77 -35 rlineto + 1 -21 0 -39 -46 -71 -1 -89 -65 vvcurveto + -24 -39 -47 -29 -45 hhcurveto + -92 2 91 102 169 9 55 -75 -42 -55 -43 -30 -39 hvcurveto + 13 -20 rlineto + 13 23 34 17 14 hhcurveto + 12 10 -2 -7 6 hvcurveto + 13 -14 4 -16 -91 -29 -4 -101 -33 vvcurveto + -56 19 -66 86 59 73 41 34 56 vhcurveto + 8 -1 rlineto + -42 4 19 -30 46 hhcurveto + 51 63 53 41 47 hvcurveto + -11 19 rlineto + endchar + + + 88 442 704 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + 347 -443 rmoveto + -19 -26 -34 -23 -27 hhcurveto + -49 0 55 61 92 4 93 8 93 hvcurveto + -13 11 -77 -35 rlineto + 1 -21 0 -39 -46 -71 -1 -89 -65 vvcurveto + -24 -39 -47 -29 -45 hhcurveto + -92 2 91 102 169 9 55 -75 -42 -55 -43 -30 -39 hvcurveto + 13 -20 rlineto + 13 23 34 17 14 hhcurveto + 12 10 -2 -7 6 hvcurveto + 13 -14 4 -16 -91 -29 -4 -101 -33 vvcurveto + -56 19 -66 86 59 73 41 34 56 vhcurveto + 8 -1 rlineto + -42 4 19 -30 46 hhcurveto + 51 63 53 41 47 hvcurveto + -11 19 rlineto + endchar + + + 88 154 561 rmoveto + 23 -12 143 131 121 -124 39 26 -157 160 rlineto + 304 -635 rmoveto + -19 -26 -34 -23 -27 hhcurveto + -49 0 55 61 92 4 93 8 93 hvcurveto + -13 11 -77 -35 rlineto + 1 -21 0 -39 -46 -71 -1 -89 -65 vvcurveto + -24 -39 -47 -29 -45 hhcurveto + -92 2 91 102 169 9 55 -75 -42 -55 -43 -30 -39 hvcurveto + 13 -20 rlineto + 13 23 34 17 14 hhcurveto + 12 10 -2 -7 6 hvcurveto + 13 -14 4 -16 -91 -29 -4 -101 -33 vvcurveto + -56 19 -66 86 59 73 41 34 56 vhcurveto + 8 -1 rlineto + -42 4 19 -30 46 hhcurveto + 51 63 53 41 47 hvcurveto + -11 19 rlineto + endchar + + + 88 477 606 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + 352 -499 rmoveto + -19 -26 -34 -23 -27 hhcurveto + -49 0 55 61 92 4 93 8 93 hvcurveto + -13 11 -77 -35 rlineto + 1 -21 0 -39 -46 -71 -1 -89 -65 vvcurveto + -24 -39 -47 -29 -45 hhcurveto + -92 2 91 102 169 9 55 -75 -42 -55 -43 -30 -39 hvcurveto + 13 -20 rlineto + 13 23 34 17 14 hhcurveto + 12 10 -2 -7 6 hvcurveto + 13 -14 4 -16 -91 -29 -4 -101 -33 vvcurveto + -56 19 -66 86 59 73 41 34 56 vhcurveto + 8 -1 rlineto + -42 4 19 -30 46 hhcurveto + 51 63 53 41 47 hvcurveto + -11 19 rlineto + endchar + + + 88 187 705 rmoveto + 162 -154 18 31 -120 157 -13 2 rlineto + 393 -634 rmoveto + -19 -26 -34 -23 -27 hhcurveto + -49 0 55 61 92 4 93 8 93 hvcurveto + -13 11 -77 -35 rlineto + 1 -21 0 -39 -46 -71 -1 -89 -65 vvcurveto + -24 -39 -47 -29 -45 hhcurveto + -92 2 91 102 169 9 55 -75 -42 -55 -43 -30 -39 hvcurveto + 13 -20 rlineto + 13 23 34 17 14 hhcurveto + 12 10 -2 -7 6 hvcurveto + 13 -14 4 -16 -91 -29 -4 -101 -33 vvcurveto + -56 19 -66 86 59 73 41 34 56 vhcurveto + 8 -1 rlineto + -42 4 19 -30 46 hhcurveto + 51 63 53 41 47 hvcurveto + -11 19 rlineto + endchar + + + 211 756 -74 rmoveto + -756 -40 756 hlineto + endchar + + + -2 387 398 rmoveto + 39 -38 18 -53 -54 vvcurveto + -76 -35 -126 -129 -67 -27 58 72 vhcurveto + 69 5 60 66 vvcurveto + 46 -10 50 -56 -50 -49 -37 -34 -38 vhcurveto + 16 -22 rlineto + 17 21 24 18 26 hhcurveto + 30 8 -43 -41 hvcurveto + -211 vlineto + -65 27 -66 81 156 142 152 156 66 -29 61 -45 48 vhcurveto + -20 -4 -42 -51 rlineto + endchar + + + -52 363 425 rmoveto + -2 -2 -2 -3 -3 vvcurveto + -2 0 -2 1 -1 vhcurveto + 17 -32 20 -36 -32 vvcurveto + -71 -57 -78 -50 -59 vhcurveto + -8 -8 -11 -14 -5 hhcurveto + -21 -32 151 60 -15 hvcurveto + 107 -28 -14 69 -51 hhcurveto + -39 -50 -33 -25 -36 hvcurveto + 9 -24 rlineto + 13 23 18 8 22 hhcurveto + 31 24 -76 -85 23 hvcurveto + 69 -258 rlineto + 24 hlineto + 5 3 14 14 11 11 59 60 55 63 45 72 rrcurveto + 28 45 27 50 55 vvcurveto + 58 -27 42 -19 -2 -3 0 -2 -3 vhcurveto + endchar + + + 18 -10 rmoveto + -21 37 -26 39 -32 38 -8 -14 -7 -14 -7 -15 33 -40 34 -41 18 -54 rrcurveto + -1 0 0 1 14 3 23 9 4 vhcurveto + 17 39 18 35 27 31 rrcurveto + 13 3 14 4 14 vhcurveto + -3 hlineto + -27 -35 -25 -36 -20 -42 rrcurveto + endchar + + + 18 -10 rmoveto + -21 37 -26 39 -32 38 -8 -14 -7 -14 -7 -15 33 -40 34 -41 18 -54 rrcurveto + -1 0 0 1 14 3 23 9 4 vhcurveto + 17 39 18 35 27 31 rrcurveto + 13 3 14 4 14 vhcurveto + -3 hlineto + -27 -35 -25 -36 -20 -42 rrcurveto + endchar + + + 315 630 724 rmoveto + -10 19 -11 16 -14 13 -49 46 -46 -45 -41 -55 -41 -56 -38 -66 -17 -33 -1 -1 rcurveline + 1 -44 25 34 94 211 60 -147 rlinecurve + 6 -15 5 5 4 5 27 35 26 37 20 41 rrcurveto + -542 -690 rmoveto + 111 -74 277 53 103 122 67 79 40 106 -45 89 -25 49 -46 42 -33 -45 -27 -37 -19 -45 -22 -41 -10 -19 -1 -34 19 -9 32 -16 38 15 21 18 rrcurveto + 11 12 21 -75 0 vvcurveto + -72 -72 -455 -111 17 200 4 53 24 42 20 36 -11 -3 -4 -9 -5 -8 -114 -174 15 -98 69 -46 rrcurveto + endchar + + + 256 668 416 rmoveto + 18 -31 20 -40 -33 vvcurveto + -81 -63 -76 -51 -64 vhcurveto + -4 -3 -8 -6 -4 hhcurveto + -8 -7 8 7 -3 hvcurveto + -44 118 -27 124 -26 126 -12 3 rcurveline + -52 -26 -52 -106 -57 -104 -57 -103 rlinecurve + -11 2 -10 81 -4 82 -15 80 rlinecurve + 41 -8 -16 55 -54 hhcurveto + -41 -54 -40 -28 -39 hvcurveto + 9 -20 rlineto + 14 27 33 17 23 hhcurveto + 10 34 1 -191 21 hvcurveto + 24 -224 7 -6 42 13 55 119 68 128 56 103 rlinecurve + 3 1 6 2 4 hhcurveto + 5 2 -6 -4 2 hvcurveto + 29 -114 45 -175 17 -48 rrcurveto + -9 3 12 -12 11 hhcurveto + 13 12 11 10 10 hvcurveto + 58 63 55 66 45 74 rrcurveto + 28 47 28 51 55 vvcurveto + 24 -18 72 -25 -3 -2 0 -1 -1 vhcurveto + -57 -35 rlineto + -2 -1 0 -3 -3 vvcurveto + -2 0 -2 1 -2 vhcurveto + endchar + + + -92 -34 rmoveto + 75 74 -46 -89 101 42 28 11 26 15 16 22 12 16 16 21 -15 18 -12 14 -27 -8 -11 -10 -23 -21 -22 -22 -20 -24 rrcurveto + -1 -3 -2 0 -2 hhcurveto + -35 42 -55 -64 -10 -40 -1 -4 8 6 2 2 rrcurveto + 182 90 rmoveto + 2 -3 1 -4 -4 -2 -20 -10 -24 -5 -25 -5 13 13 12 14 17 9 10 5 14 -4 4 -8 rrcurveto + endchar + + + 127 230 8 rmoveto + 180 35 163 279 -129 131 -12 12 -28 13 -15 -17 -32 -36 -16 -48 -22 -44 -10 -20 -3 -24 15 -17 17 -19 43 -2 32 7 7 -10 7 -20 -7 -7 -20 -23 -25 -19 -31 -12 rrcurveto + -115 -47 -121 -40 -104 -58 -6 -3 0 -10 7 -1 73 -7 79 -7 73 14 rrcurveto + endchar + + + 127 230 8 rmoveto + 180 35 163 279 -129 131 -12 12 -28 13 -15 -17 -32 -36 -16 -48 -22 -44 -10 -20 -3 -24 15 -17 17 -19 43 -2 32 7 7 -10 7 -20 -7 -7 -20 -23 -25 -19 -31 -12 rrcurveto + -115 -47 -121 -40 -104 -58 -6 -3 0 -10 7 -1 73 -7 79 -7 73 14 rrcurveto + endchar + + + 127 465 619 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -235 -611 rmoveto + 180 35 163 279 -129 131 -12 12 -28 13 -15 -17 -32 -36 -16 -48 -22 -44 -10 -20 -3 -24 15 -17 17 -19 43 -2 32 7 7 -10 7 -20 -7 -7 -20 -23 -25 -19 -31 -12 rrcurveto + -115 -47 -121 -40 -104 -58 -6 -3 0 -10 7 -1 73 -7 79 -7 73 14 rrcurveto + endchar + + + 127 396 559 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + -166 -551 rmoveto + 180 35 163 279 -129 131 -12 12 -28 13 -15 -17 -32 -36 -16 -48 -22 -44 -10 -20 -3 -24 15 -17 17 -19 43 -2 32 7 7 -10 7 -20 -7 -7 -20 -23 -25 -19 -31 -12 rrcurveto + -115 -47 -121 -40 -104 -58 -6 -3 0 -10 7 -1 73 -7 79 -7 73 14 rrcurveto + endchar + + + 46 182 464 rmoveto + -51 -37 -42 -55 -66 vvcurveto + -43 21 -42 20 -37 vhcurveto + -28 -52 -58 -121 -76 vvcurveto + -61 31 -70 75 92 42 100 82 15 -2 14 -4 15 vhcurveto + -21 20 27 -15 30 hhcurveto + 37 39 29 28 28 hvcurveto + 66 66 25 97 92 vvcurveto + 72 -21 94 -99 -118 -79 -119 -62 -39 vhcurveto + -18 -26 rlineto + -9 hlineto + -11 22 -11 28 27 vvcurveto + 43 25 36 26 33 vhcurveto + 73 -395 rmoveto + -19 56 -31 59 -30 53 40 62 63 92 39 16 rrcurveto + 11 28 10 2 19 hhcurveto + 80 22 -94 -65 -92 -23 -110 -88 -27 -20 17 35 -9 hvcurveto + -7 1 rlineto + -162 42 rmoveto + 38 -60 51 -75 -60 vvcurveto + -45 -19 -52 -58 -56 -16 71 47 50 21 72 30 52 vhcurveto + endchar + + + -55 410 462 rmoveto + 2 -2 -2 0 -2 hhcurveto + -3 -2 0 -2 -1 hvcurveto + -44 -51 -59 -70 -36 -48 -6 1 rcurveline + -29 56 -41 72 -21 23 rrcurveto + 15 -14 -23 4 -17 hhcurveto + -33 -50 -37 -27 -35 hvcurveto + 14 -18 rlineto + 12 18 25 13 21 hhcurveto + 49 48 -107 -77 38 hvcurveto + -49 -64 -50 -69 -43 -69 rrcurveto + -8 vlineto + 28 -25 16 4 30 77 40 62 39 60 rlinecurve + 7 hlineto + -129 66 34 -74 51 hhcurveto + 42 51 56 38 35 hvcurveto + -8 19 rlineto + -8 hlineto + -17 -20 -27 -21 -24 hhcurveto + -44 -59 106 90 -41 hvcurveto + 52 61 64 65 56 39 rrcurveto + 2 1 1 1 3 vvcurveto + 1 -2 2 -1 1 vhcurveto + endchar + + + -73 411 -137 rmoveto + 32 43 42 54 47 vvcurveto + 42 -55 9 -32 vhcurveto + -40 -84 -11 -56 hhcurveto + -66 -53 39 69 132 122 48 108 hvcurveto + 23 vlineto + -74 8 -86 21 91 vvcurveto + 110 112 34 87 10 vhcurveto + 28 vlineto + -6 -32 -35 -5 -31 hhcurveto + -50 -51 13 32 -39 hvcurveto + -8 hlineto + -28 -46 41 -22 47 -5 44 -1 rlinecurve + 1 -8 rlineto + -68 -27 -68 -55 -79 vvcurveto + -70 57 -24 51 -11 vhcurveto + -6 vlineto + -94 -29 -91 -77 -108 vvcurveto + -81 62 -53 83 vhcurveto + 28 106 16 52 hhcurveto + 34 45 -9 -42 -24 -19 -30 -15 -25 hvcurveto + endchar + + + 27 104 -182 rmoveto + -28 27 53 -23 47 hhcurveto + 107 103 54 130 36 hvcurveto + 22 95 -15 212 14 204 -12 4 rcurveline + -79 -38 rlineto + 5 -69 3 -72 -72 vvcurveto + -36 -1 -36 -1 -35 vhcurveto + -22 -37 -49 -30 -48 hhcurveto + -24 -24 7 19 -15 hvcurveto + -16 21 -9 30 -3 93 rrcurveto + 58 4 58 56 vvcurveto + 37 -20 33 -43 -46 -79 -57 -10 -14 vhcurveto + 11 -19 rlineto + 12 23 31 16 17 hhcurveto + 41 5 -44 -72 hvcurveto + -50 -4 -42 -45 vvcurveto + -67 7 -98 97 64 68 42 35 56 vhcurveto + 6 -5 -1 -32 -1 -33 -6 -33 rlinecurve + -57 -10 -24 -101 -107 hhcurveto + -45 -38 39 38 -21 hvcurveto + -13 hlineto + -44 -56 rlineto + endchar + + + 7 441 699 rmoveto + -47 36 -13 -2 -120 -157 18 -31 rlineto + -175 -727 rmoveto + -28 27 53 -23 47 hhcurveto + 107 103 54 130 36 hvcurveto + 22 95 -15 212 14 204 -12 4 rcurveline + -79 -38 rlineto + 5 -69 3 -72 -72 vvcurveto + -36 -1 -36 -1 -35 vhcurveto + -22 -37 -49 -30 -48 hhcurveto + -24 -24 7 19 -15 hvcurveto + -16 21 -9 30 -3 93 rrcurveto + 58 4 58 56 vvcurveto + 37 -20 33 -43 -46 -79 -57 -10 -14 vhcurveto + 11 -19 rlineto + 12 23 31 16 17 hhcurveto + 41 5 -44 -72 hvcurveto + -50 -4 -42 -45 vvcurveto + -67 7 -98 97 64 68 42 35 56 vhcurveto + 6 -5 -1 -32 -1 -33 -6 -33 rlinecurve + -57 -10 -24 -101 -107 hhcurveto + -45 -38 39 38 -21 hvcurveto + -13 hlineto + -44 -56 rlineto + endchar + + + 7 456 605 rmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -202 hmoveto + 30 -20 28 -34 -29 -35 -22 -34 -32 26 -26 32 32 26 23 33 2 vhcurveto + -150 -787 rmoveto + -28 27 53 -23 47 hhcurveto + 107 103 54 130 36 hvcurveto + 22 95 -15 212 14 204 -12 4 rcurveline + -79 -38 rlineto + 5 -69 3 -72 -72 vvcurveto + -36 -1 -36 -1 -35 vhcurveto + -22 -37 -49 -30 -48 hhcurveto + -24 -24 7 19 -15 hvcurveto + -16 21 -9 30 -3 93 rrcurveto + 58 4 58 56 vvcurveto + 37 -20 33 -43 -46 -79 -57 -10 -14 vhcurveto + 11 -19 rlineto + 12 23 31 16 17 hhcurveto + 41 5 -44 -72 hvcurveto + -50 -4 -42 -45 vvcurveto + -67 7 -98 97 64 68 42 35 56 vhcurveto + 6 -5 -1 -32 -1 -33 -6 -33 rlinecurve + -57 -10 -24 -101 -107 hhcurveto + -45 -38 39 38 -21 hvcurveto + -13 hlineto + -44 -56 rlineto + endchar + + + 251 78 24 rmoveto + 157 -86 273 169 84 130 26 39 7 38 -25 27 -18 19 -33 -1 -28 8 -160 45 117 73 49 -15 20 32 11 39 17 36 rrcurveto + 9 4 -14 1 -4 hhcurveto + -35 -1 -28 -29 -19 -18 -42 -40 -83 -134 16 -56 15 -54 64 -20 67 -7 -60 -39 -69 -30 -83 -15 -69 -13 -90 2 -45 35 -103 81 104 151 39 81 4 8 -9 1 -3 -5 rrcurveto + -67 -94 -160 -272 173 -95 rrcurveto + 246 -158 rmoveto + 60 119 -64 -12 -64 -12 -64 -12 rlinecurve + -60 -119 64 12 64 12 64 12 rlinecurve + endchar + + + 251 78 24 rmoveto + 157 -86 273 169 84 130 26 39 7 38 -25 27 -18 19 -33 -1 -28 8 -160 45 117 73 49 -15 20 32 11 39 17 36 rrcurveto + 9 4 -14 1 -4 hhcurveto + -35 -1 -28 -29 -19 -18 -42 -40 -83 -134 16 -56 15 -54 64 -20 67 -7 -60 -39 -69 -30 -83 -15 -69 -13 -90 2 -45 35 -103 81 104 151 39 81 4 8 -9 1 -3 -5 rrcurveto + -67 -94 -160 -272 173 -95 rrcurveto + endchar + + + 251 296 573 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + -218 -549 rmoveto + 157 -86 273 169 84 130 26 39 7 38 -25 27 -18 19 -33 -1 -28 8 -160 45 117 73 49 -15 20 32 11 39 17 36 rrcurveto + 9 4 -14 1 -4 hhcurveto + -35 -1 -28 -29 -19 -18 -42 -40 -83 -134 16 -56 15 -54 64 -20 67 -7 -60 -39 -69 -30 -83 -15 -69 -13 -90 2 -45 35 -103 81 104 151 39 81 4 8 -9 1 -3 -5 rrcurveto + -67 -94 -160 -272 173 -95 rrcurveto + endchar + + + 251 339 671 rmoveto + -21 37 -26 39 -32 38 -8 -14 -7 -14 -7 -15 33 -40 34 -41 18 -54 rrcurveto + -1 0 0 1 14 3 23 9 4 vhcurveto + 17 39 18 35 27 31 rrcurveto + 13 3 14 4 14 vhcurveto + -3 hlineto + -27 -35 -25 -36 -20 -42 rrcurveto + -261 -647 rmoveto + 157 -86 273 169 84 130 26 39 7 38 -25 27 -18 19 -33 -1 -28 8 -160 45 117 73 49 -15 20 32 11 39 17 36 rrcurveto + 9 4 -14 1 -4 hhcurveto + -35 -1 -28 -29 -19 -18 -42 -40 -83 -134 16 -56 15 -54 64 -20 67 -7 -60 -39 -69 -30 -83 -15 -69 -13 -90 2 -45 35 -103 81 104 151 39 81 4 8 -9 1 -3 -5 rrcurveto + -67 -94 -160 -272 173 -95 rrcurveto + endchar + + + 335 344 463 rmoveto + -14 32 -15 11 -19 -8 -19 -8 -14 -13 -10 -17 -19 -33 -19 -31 -21 -30 -21 -30 -26 -24 -31 -18 -41 -24 -37 -34 -18 -48 -10 -24 -11 -64 5 -37 3 -23 12 -16 22 -9 rrcurveto + 44 -18 62 0 55 9 162 25 129 59 97 86 29 26 31 25 11 45 -125 -71 -129 -57 -184 -11 -55 -3 -53 6 -50 17 rrcurveto + 4 3 4 7 4 vhcurveto + 56 30 46 50 36 70 14 26 17 23 32 8 29 -4 12 -29 2 -29 rrcurveto + -6 4 -2 6 4 vhcurveto + 6 4 3 4 2 4 17 41 -2 60 -11 44 rrcurveto + endchar + + + 335 67 158 rmoveto + -46 33 -5 -10 -5 -19 -5 -30 rlinecurve + -9 -56 3 -45 41 -17 44 -18 62 0 55 9 161 25 130 60 97 86 29 26 30 25 11 45 -125 -71 -129 -57 -183 -11 -55 -3 -53 6 -50 17 rrcurveto + 1 1 2 1 2 vhcurveto + endchar + + + 335 291 612 rmoveto + 37 26 20 43 -28 18 -15 10 -24 1 -12 14 15 21 26 3 8 18 21 45 rcurveline + -9 -4 -9 -4 -8 -6 -26 -20 -88 -94 50 -28 11 -6 16 -6 11 -7 6 -4 -8 -5 -3 -2 -29 -16 -33 -13 -31 -14 36 6 35 2 31 22 rrcurveto + 53 -149 rmoveto + -14 32 -15 11 -19 -8 -19 -8 -14 -13 -10 -17 -19 -33 -19 -31 -21 -30 -21 -30 -26 -24 -31 -18 -41 -24 -37 -34 -18 -48 -10 -24 -11 -64 5 -37 3 -23 12 -16 22 -9 rrcurveto + 44 -18 62 0 55 9 162 25 129 59 97 86 29 26 31 25 11 45 -125 -71 -129 -57 -184 -11 -55 -3 -53 6 -50 17 rrcurveto + 4 3 4 7 4 vhcurveto + 56 30 46 50 36 70 14 26 17 23 32 8 29 -4 12 -29 2 -29 rrcurveto + -6 4 -2 6 4 vhcurveto + 6 4 3 4 2 4 17 41 -2 60 -11 44 rrcurveto + endchar + + + 78 250 299 rmoveto + -21 0 -20 -21 vvcurveto + -149 hlineto + -7 -40 rlineto + 156 hlineto + -66 -1 -67 -2 -66 vhcurveto + 11 -9 90 29 -6 179 rlineto + 166 hlineto + 6 40 rlineto + -173 hlineto + -2 69 5 8 5 7 5 8 rlinecurve + 152 hlineto + 6 40 rlineto + -131 hlineto + 67 99 67 87 92 120 -4 18 rcurveline + -85 -17 -36 -57 -84 -145 -8 -14 rlinecurve + -54 -30 -35 -53 -5 hhcurveto + -6 -5 6 2 -1 hvcurveto + -141 325 rlineto + -145 hlineto + -7 -7 rlineto + -28 vlineto + 40 -6 23 -6 23 -45 114 -225 rcurveline + -116 hlineto + -7 -40 rlineto + 143 hlineto + endchar + + + -82 402 462 rmoveto + -17 -21 -23 -14 -29 -56 -68 31 -51 hhcurveto + -29 -13 -10 -31 -20 hvcurveto + -50 -89 20 -13 rlineto + 43 31 21 28 37 36 51 -19 33 hhcurveto + 11 9 0 2 10 hvcurveto + -295 -381 15 -19 rlineto + 6 hlineto + 23 16 22 20 24 hhcurveto + 117 -11 43 -4 75 -10 11 1 rlinecurve + 50 -1 27 28 20 40 41 80 rcurveline + -22 12 rlineto + -36 -23 -29 -42 -57 hhcurveto + -9 -98 3 10 -98 hvcurveto + -5 8 99 134 108 133 83 88 rlinecurve + -14 13 rlineto + endchar + + + 317 295 479 rmoveto + 22 -321 74 118 -22 321 rlineto + 220 -109 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + -8 -298 rmoveto + 34 45 46 39 -42 50 -34 40 -77 -20 -31 -29 -65 -61 -60 -65 -58 -67 -88 -15 -97 -8 -102 3 rrcurveto + -5 -4 -9 -3 5 hvcurveto + 74 -44 37 -39 65 -6 28 -3 33 4 44 11 131 34 99 53 67 90 rrcurveto + -49 22 rmoveto + 4 -8 5 -14 -11 -5 -57 -27 -68 -14 -70 -14 36 37 34 39 47 25 28 15 40 -12 12 -22 rrcurveto + endchar + + + 105 439 470 rmoveto + -71 66 -27 -34 -28 -35 -27 -34 rlinecurve + 71 -66 28 34 27 34 27 35 rlinecurve + 9 -198 rmoveto + -1 7 -9 1 -3 -8 -16 -35 -23 -28 -30 -20 -64 -43 -79 -27 -81 -25 -236 -73 96 -17 156 -4 101 -3 67 33 45 54 31 37 33 84 13 67 rrcurveto + endchar + + + -45 290 704 rmoveto + -44 -18 -49 -24 -33 -33 rrcurveto + -85 -85 -45 -121 -120 vvcurveto + -115 28 -202 145 184 69 211 159 133 -49 138 -121 77 vhcurveto + -56 -64 rmoveto + 45 -19 44 -70 7 -12 rrcurveto + 44 -79 24 -85 -90 vvcurveto + -97 -24 -136 -122 -64 -46 79 68 -20 vhcurveto + -16 55 -5 59 58 vvcurveto + 101 45 113 88 55 vhcurveto + endchar + + + -133 30 263 rmoveto + -2 -2 -1 -1 -2 vvcurveto + -3 2 -3 3 -2 vhcurveto + 83 -70 rlineto + -2 2 3 -1 2 hhcurveto + 2 1 2 2 2 hvcurveto + 75 91 rlineto + 2 2 1 2 2 vvcurveto + 2 -2 3 -3 2 vhcurveto + -83 70 rlineto + 2 -2 -3 1 -2 hhcurveto + -2 -2 -1 -2 -2 hvcurveto + endchar + + + -99 72 184 rmoveto + -1 -1 -1 -1 -1 vvcurveto + -2 1 -3 2 -1 vhcurveto + 59 -49 rlineto + -1 1 2 -1 1 hhcurveto + 2 1 1 2 1 hvcurveto + 52 63 rlineto + 2 2 1 1 2 vvcurveto + 1 -2 2 -2 2 vhcurveto + -58 48 rlineto + 2 -1 -3 1 -1 hhcurveto + -1 -2 -1 -2 -1 hvcurveto + endchar + + + -99 72 453 rmoveto + -1 -1 -1 -1 -1 vvcurveto + -2 1 -3 2 -1 vhcurveto + 59 -49 rlineto + -1 1 2 -1 1 hhcurveto + 2 1 1 2 1 hvcurveto + 52 63 rlineto + 2 2 1 1 2 vvcurveto + 1 -2 2 -2 2 vhcurveto + -58 49 rlineto + 1 -1 -3 1 -1 hhcurveto + -1 -2 -1 -1 -1 hvcurveto + endchar + + + 215 422 rmoveto + -29 -10 -34 -15 -22 -20 rrcurveto + -58 -51 -31 -72 -72 vvcurveto + -71 21 -119 97 122 50 123 99 79 -33 84 -83 45 vhcurveto + -38 -38 rmoveto + 31 -11 30 -42 4 -8 rrcurveto + 30 -47 17 -51 -54 vvcurveto + -59 -18 -81 -81 -45 -30 48 40 -14 vhcurveto + -11 33 -3 36 35 vvcurveto + 60 31 67 59 34 vhcurveto + endchar + + + 215 697 rmoveto + -29 -10 -34 -15 -22 -20 rrcurveto + -58 -51 -31 -72 -72 vvcurveto + -71 21 -119 97 122 50 123 99 79 -33 84 -83 45 vhcurveto + -38 -38 rmoveto + 31 -11 30 -42 4 -8 rrcurveto + 30 -47 17 -51 -54 vvcurveto + -59 -18 -81 -81 -45 -30 48 40 -14 vhcurveto + -11 33 -3 36 35 vvcurveto + 60 31 67 59 34 vhcurveto + endchar + + + -124 363 -136 rmoveto + 32 40 40 54 48 vvcurveto + 36 -39 11 -41 vhcurveto + -24 -37 -6 -40 hhcurveto + -104 -45 80 83 181 148 196 155 49 hvcurveto + 19 vlineto + -5 -34 -29 -3 -26 hhcurveto + -55 -42 12 32 -48 hvcurveto + 4 -7 1 0 -2 hhcurveto + -2 -1 0 -1 -2 hvcurveto + -28 -35 rlineto + -2 -2 0 -1 -1 vvcurveto + 18 -17 26 -6 25 -4 91 -8 rcurveline + 1 -7 rlineto + -130 -109 -134 -171 -159 vvcurveto + -93 38 -91 124 vhcurveto + 26 68 9 41 hhcurveto + 22 29 -14 -24 -26 -19 -32 -15 -27 hvcurveto + endchar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/merge/merge_test.py b/Tests/merge/merge_test.py new file mode 100644 index 00000000..5ff12d1c --- /dev/null +++ b/Tests/merge/merge_test.py @@ -0,0 +1,237 @@ +import io +import itertools +from fontTools import ttLib +from fontTools.ttLib.tables._g_l_y_f import Glyph +from fontTools.fontBuilder import FontBuilder +from fontTools.merge import Merger, main as merge_main +import difflib +import os +import re +import shutil +import sys +import tempfile +import unittest +import pathlib +import pytest + + +class MergeIntegrationTest(unittest.TestCase): + def setUp(self): + self.tempdir = None + self.num_tempfiles = 0 + + def tearDown(self): + if self.tempdir: + shutil.rmtree(self.tempdir) + + @staticmethod + def getpath(testfile): + path, _ = os.path.split(__file__) + return os.path.join(path, "data", testfile) + + def temp_path(self, suffix): + if not self.tempdir: + self.tempdir = tempfile.mkdtemp() + self.num_tempfiles += 1 + return os.path.join(self.tempdir, "tmp%d%s" % (self.num_tempfiles, suffix)) + + IGNORED_LINES_RE = re.compile( + "^( 0 + s = (19, 0) + e = (110, 0) + pt = (109.05194805194802, 0.0) + assert bezierTools._line_t_of_pt(s, e, pt) == pytest.approx(0.98958184) diff --git a/Tests/misc/plistlib_test.py b/Tests/misc/plistlib_test.py index b2ce408d..5659d690 100644 --- a/Tests/misc/plistlib_test.py +++ b/Tests/misc/plistlib_test.py @@ -5,9 +5,9 @@ import codecs import collections from io import BytesIO from numbers import Integral -from fontTools.misc.py23 import tostr from fontTools.misc import etree from fontTools.misc import plistlib +from fontTools.misc.textTools import tostr from fontTools.ufoLib.plistlib import ( readPlist, readPlistFromString, writePlist, writePlistToString, ) diff --git a/Tests/misc/transform_test.py b/Tests/misc/transform_test.py index 4efab81f..53d4a202 100644 --- a/Tests/misc/transform_test.py +++ b/Tests/misc/transform_test.py @@ -23,6 +23,14 @@ class TransformTest(object): [(0, 0), (0, 100), (100, 100), (100, 0)] ) == [(0, 0), (0, 300), (200, 300), (200, 0)] + def test_transformVector(self): + t = Transform(2, 0, 0, 3, -10, 30) + assert t.transformVector((-4, 5)) == (-8, 15) + + def test_transformVectors(self): + t = Transform(2, 0, 0, 3, -10, 30) + assert t.transformVectors([(-4, 5), (-6, 7)]) == [(-8, 15), (-12, 21)] + def test_translate(self): t = Transform() assert t.translate(20, 30) == Transform(1, 0, 0, 1, 20, 30) diff --git a/Tests/misc/xmlReader_test.py b/Tests/misc/xmlReader_test.py index f6775cbc..ec4aff57 100644 --- a/Tests/misc/xmlReader_test.py +++ b/Tests/misc/xmlReader_test.py @@ -1,8 +1,8 @@ -from fontTools.misc.py23 import strjoin from io import BytesIO import os import unittest from fontTools.ttLib import TTFont +from fontTools.misc.textTools import strjoin from fontTools.misc.xmlReader import XMLReader, ProgressPrinter, BUFSIZE import tempfile diff --git a/Tests/misc/xmlWriter_test.py b/Tests/misc/xmlWriter_test.py index fd4f2408..69471543 100644 --- a/Tests/misc/xmlWriter_test.py +++ b/Tests/misc/xmlWriter_test.py @@ -1,11 +1,10 @@ -from fontTools.misc.py23 import bytesjoin, tobytes from io import BytesIO import os import unittest +from fontTools.misc.textTools import bytesjoin, tobytes from fontTools.misc.xmlWriter import XMLWriter -linesep = tobytes(os.linesep) -HEADER = b'' + linesep +HEADER = b'\n' class TestXMLWriter(unittest.TestCase): @@ -17,30 +16,30 @@ class TestXMLWriter(unittest.TestCase): def test_comment_multiline(self): writer = XMLWriter(BytesIO()) writer.comment("Hello world\nHow are you?") - self.assertEqual(HEADER + b"", + self.assertEqual(HEADER + b"", writer.file.getvalue()) def test_encoding_default(self): writer = XMLWriter(BytesIO()) - self.assertEqual(b'' + linesep, + self.assertEqual(b'\n', writer.file.getvalue()) def test_encoding_utf8(self): # https://github.com/fonttools/fonttools/issues/246 writer = XMLWriter(BytesIO(), encoding="utf8") - self.assertEqual(b'' + linesep, + self.assertEqual(b'\n', writer.file.getvalue()) def test_encoding_UTF_8(self): # https://github.com/fonttools/fonttools/issues/246 writer = XMLWriter(BytesIO(), encoding="UTF-8") - self.assertEqual(b'' + linesep, + self.assertEqual(b'\n', writer.file.getvalue()) def test_encoding_UTF8(self): # https://github.com/fonttools/fonttools/issues/246 writer = XMLWriter(BytesIO(), encoding="UTF8") - self.assertEqual(b'' + linesep, + self.assertEqual(b'\n', writer.file.getvalue()) def test_encoding_other(self): @@ -61,7 +60,7 @@ class TestXMLWriter(unittest.TestCase): writer.newline() writer.dedent() writer.write("baz") - self.assertEqual(HEADER + bytesjoin(["foo", " bar", "baz"], linesep), + self.assertEqual(HEADER + bytesjoin(["foo", " bar", "baz"], "\n"), writer.file.getvalue()) def test_writecdata(self): @@ -89,7 +88,7 @@ class TestXMLWriter(unittest.TestCase): "66756c20 67726f75 70206f66 206c6574", "74657273 2c206e6f 74206120 67726f75", "70206f66 20626561 75746966 756c206c", - "65747465 72732e ", ""], joiner=linesep), writer.file.getvalue()) + "65747465 72732e ", ""], joiner="\n"), writer.file.getvalue()) def test_stringifyattrs(self): writer = XMLWriter(BytesIO()) diff --git a/Tests/mtiLib/mti_test.py b/Tests/mtiLib/mti_test.py index f0e7bdf3..8a80113c 100644 --- a/Tests/mtiLib/mti_test.py +++ b/Tests/mtiLib/mti_test.py @@ -182,14 +182,14 @@ class MtiTest(unittest.TestCase): decompiled.decompile(blob, font) # XML from built object. - writer = XMLWriter(StringIO(), newlinestr='\n') + writer = XMLWriter(StringIO()) writer.begintag(tableTag); writer.newline() table.toXML(writer, font) writer.endtag(tableTag); writer.newline() xml_built = writer.file.getvalue() # XML from decompiled object. - writer = XMLWriter(StringIO(), newlinestr='\n') + writer = XMLWriter(StringIO()) writer.begintag(tableTag); writer.newline() decompiled.toXML(writer, font) writer.endtag(tableTag); writer.newline() @@ -208,7 +208,7 @@ class MtiTest(unittest.TestCase): reader.read(rootless=True) # XML from object read from XML. - writer = XMLWriter(StringIO(), newlinestr='\n') + writer = XMLWriter(StringIO()) writer.begintag(tableTag); writer.newline() font2[tableTag].toXML(writer, font) writer.endtag(tableTag); writer.newline() diff --git a/Tests/otlLib/builder_test.py b/Tests/otlLib/builder_test.py index 1c2c324d..548a31e9 100644 --- a/Tests/otlLib/builder_test.py +++ b/Tests/otlLib/builder_test.py @@ -1,6 +1,6 @@ import io import struct -from fontTools.misc.fixedTools import floatToFixed +from fontTools.misc.fixedTools import floatToFixed, fixedToFloat from fontTools.misc.testTools import getXML from fontTools.otlLib import builder, error from fontTools import ttLib @@ -204,7 +204,7 @@ class BuilderTest(object): assert builder.buildComponentRecord(None) is None def test_buildCoverage(self): - cov = builder.buildCoverage({"two", "four"}, {"two": 2, "four": 4}) + cov = builder.buildCoverage(("two", "four", "two"), {"two": 2, "four": 4}) assert getXML(cov.toXML) == [ "", ' ', @@ -918,7 +918,6 @@ class BuilderTest(object): ("A", "zero"): (d0, d50), ("A", "one"): (None, d20), ("B", "five"): (d8020, d50), - }, self.GLYPHMAP, ) @@ -1120,262 +1119,309 @@ class ClassDefBuilderTest(object): buildStatTable_test_data = [ - ([ - dict( - tag="wght", - name="Weight", - values=[ - dict(value=100, name='Thin'), - dict(value=400, name='Regular', flags=0x2), - dict(value=900, name='Black')])], None, "Regular", [ - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ']), - ([ - dict( - tag="wght", - name=dict(en="Weight", nl="Gewicht"), - values=[ - dict(value=100, name=dict(en='Thin', nl='Dun')), - dict(value=400, name='Regular', flags=0x2), - dict(value=900, name='Black'), - ]), - dict( - tag="wdth", - name="Width", - values=[ - dict(value=50, name='Condensed'), - dict(value=100, name='Regular', flags=0x2), - dict(value=200, name='Extended')])], None, 2, [ - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ']), - ([ - dict( - tag="wght", - name="Weight", - values=[ - dict(value=400, name='Regular', flags=0x2), - dict(value=600, linkedValue=650, name='Bold')])], None, 18, [ - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ']), - ([ - dict( - tag="opsz", - name="Optical Size", - values=[ - dict(nominalValue=6, rangeMaxValue=10, name='Small'), - dict(rangeMinValue=10, nominalValue=14, rangeMaxValue=24, name='Text', flags=0x2), - dict(rangeMinValue=24, nominalValue=600, name='Display')])], None, 2, [ - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ']), - ([ - dict( - tag="wght", - name="Weight", - ordering=1, - values=[]), - dict( - tag="ABCD", - name="ABCDTest", - ordering=0, - values=[ - dict(value=100, name="Regular", flags=0x2)])], - [dict(location=dict(wght=300, ABCD=100), name='Regular ABCD')], 18, [ - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ']), + ( + [ + dict( + tag="wght", + name="Weight", + values=[ + dict(value=100, name="Thin"), + dict(value=400, name="Regular", flags=0x2), + dict(value=900, name="Black"), + ], + ) + ], + None, + "Regular", + [ + " ", + ' ', + ' ', + " ", + " ", + ' ', + ' ', + ' ', + ' ', + " ", + " ", + " ", + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + ' ', + " ", + ], + ), + ( + [ + dict( + tag="wght", + name=dict(en="Weight", nl="Gewicht"), + values=[ + dict(value=100, name=dict(en="Thin", nl="Dun")), + dict(value=400, name="Regular", flags=0x2), + dict(value=900, name="Black"), + ], + ), + dict( + tag="wdth", + name="Width", + values=[ + dict(value=50, name="Condensed"), + dict(value=100, name="Regular", flags=0x2), + dict(value=200, name="Extended"), + ], + ), + ], + None, + 2, + [ + " ", + ' ', + ' ', + " ", + " ", + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + " ", + " ", + " ", + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + ' ', + " ", + ], + ), + ( + [ + dict( + tag="wght", + name="Weight", + values=[ + dict(value=400, name="Regular", flags=0x2), + dict(value=600, linkedValue=650, name="Bold"), + ], + ) + ], + None, + 18, + [ + " ", + ' ', + ' ', + " ", + " ", + ' ', + ' ', + ' ', + ' ', + " ", + " ", + " ", + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + ' ', + " ", + ], + ), + ( + [ + dict( + tag="opsz", + name="Optical Size", + values=[ + dict(nominalValue=6, rangeMaxValue=10, name="Small"), + dict( + rangeMinValue=10, + nominalValue=14, + rangeMaxValue=24, + name="Text", + flags=0x2, + ), + dict(rangeMinValue=24, nominalValue=600, name="Display"), + ], + ) + ], + None, + 2, + [ + " ", + ' ', + ' ', + " ", + " ", + ' ', + ' ', + ' ', + ' ', + " ", + " ", + " ", + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + ' ', + " ", + ], + ), + ( + [ + dict(tag="wght", name="Weight", ordering=1, values=[]), + dict( + tag="ABCD", + name="ABCDTest", + ordering=0, + values=[dict(value=100, name="Regular", flags=0x2)], + ), + ], + [dict(location=dict(wght=300, ABCD=100), name="Regular ABCD")], + 18, + [ + " ", + ' ', + ' ', + " ", + " ", + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + " ", + " ", + " ", + " ", + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + ' ', + ' ', + " ", + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + ' ', + " ", + ], + ), ] -@pytest.mark.parametrize("axes, axisValues, elidedFallbackName, expected_ttx", buildStatTable_test_data) +@pytest.mark.parametrize( + "axes, axisValues, elidedFallbackName, expected_ttx", buildStatTable_test_data +) def test_buildStatTable(axes, axisValues, elidedFallbackName, expected_ttx): font = ttLib.TTFont() font["name"] = ttLib.newTable("name") @@ -1402,6 +1448,100 @@ def test_buildStatTable(axes, axisValues, elidedFallbackName, expected_ttx): assert expected_ttx == ttx +def test_buildStatTable_platform_specific_names(): + # PR: https://github.com/fonttools/fonttools/pull/2528 + # Introduce new 'platform' feature for creating a STAT table. + # Set windowsNames and or macNames to create name table entries + # in the specified platforms + font_obj = ttLib.TTFont() + font_obj["name"] = ttLib.newTable("name") + font_obj["name"].names = [] + + wght_values = [ + dict(nominalValue=200, rangeMinValue=200, rangeMaxValue=250, name="ExtraLight"), + dict(nominalValue=300, rangeMinValue=250, rangeMaxValue=350, name="Light"), + dict( + nominalValue=400, + rangeMinValue=350, + rangeMaxValue=450, + name="Regular", + flags=0x2, + ), + dict(nominalValue=500, rangeMinValue=450, rangeMaxValue=650, name="Medium"), + dict(nominalValue=700, rangeMinValue=650, rangeMaxValue=750, name="Bold"), + dict(nominalValue=800, rangeMinValue=750, rangeMaxValue=850, name="ExtraBold"), + dict(nominalValue=900, rangeMinValue=850, rangeMaxValue=900, name="Black"), + ] + + AXES = [ + dict( + tag="wght", + name="Weight", + ordering=1, + values=wght_values, + ), + ] + + font_obj["name"].setName("ExtraLight", 260, 3, 1, 0x409) + font_obj["name"].setName("Light", 261, 3, 1, 0x409) + font_obj["name"].setName("Regular", 262, 3, 1, 0x409) + font_obj["name"].setName("Medium", 263, 3, 1, 0x409) + font_obj["name"].setName("Bold", 264, 3, 1, 0x409) + font_obj["name"].setName("ExtraBold", 265, 3, 1, 0x409) + font_obj["name"].setName("Black", 266, 3, 1, 0x409) + + font_obj["name"].setName("Weight", 270, 3, 1, 0x409) + + expected_names = [x.string for x in font_obj["name"].names] + + builder.buildStatTable(font_obj, AXES, windowsNames=True, macNames=False) + actual_names = [x.string for x in font_obj["name"].names] + + # no new name records were added by buildStatTable + # because windows-only names with the same strings were already present + assert expected_names == actual_names + + font_obj["name"].removeNames(nameID=270) + expected_names = [x.string for x in font_obj["name"].names] + ["Weight"] + + builder.buildStatTable(font_obj, AXES, windowsNames=True, macNames=False) + actual_names = [x.string for x in font_obj["name"].names] + # One new name records 'Weight' were added by buildStatTable + assert expected_names == actual_names + + builder.buildStatTable(font_obj, AXES, windowsNames=True, macNames=True) + actual_names = [x.string for x in font_obj["name"].names] + expected_names = [ + "Weight", + "Weight", + "Weight", + "ExtraLight", + "ExtraLight", + "ExtraLight", + "Light", + "Light", + "Light", + "Regular", + "Regular", + "Regular", + "Medium", + "Medium", + "Medium", + "Bold", + "Bold", + "Bold", + "ExtraBold", + "ExtraBold", + "ExtraBold", + "Black", + "Black", + "Black", + ] + # Because there is an inconsistency in the names add new name IDs + # for each platform -> windowsNames=True, macNames=True + assert sorted(expected_names) == sorted(actual_names) + + def test_stat_infinities(): negInf = floatToFixed(builder.AXIS_VALUE_NEGATIVE_INFINITY, 16) assert struct.pack(">l", negInf) == b"\x80\x00\x00\x00" @@ -1412,7 +1552,7 @@ def test_stat_infinities(): class ChainContextualRulesetTest(object): def test_makeRulesets(self): font = ttLib.TTFont() - font.setGlyphOrder(["a","b","c","d","A","B","C","D","E"]) + font.setGlyphOrder(["a", "b", "c", "d", "A", "B", "C", "D", "E"]) sb = builder.ChainContextSubstBuilder(font, None) prefix, input_, suffix, lookups = [["a"], ["b"]], [["c"]], [], [None] sb.rules.append(builder.ChainContextualRule(prefix, input_, suffix, lookups)) @@ -1425,7 +1565,7 @@ class ChainContextualRulesetTest(object): # Second subtable has some glyph classes prefix, input_, suffix, lookups = [["A"]], [["E"]], [], [None] sb.rules.append(builder.ChainContextualRule(prefix, input_, suffix, lookups)) - prefix, input_, suffix, lookups = [["A"]], [["C","D"]], [], [None] + prefix, input_, suffix, lookups = [["A"]], [["C", "D"]], [], [None] sb.rules.append(builder.ChainContextualRule(prefix, input_, suffix, lookups)) prefix, input_, suffix, lookups = [["A", "B"]], [["E"]], [], [None] sb.rules.append(builder.ChainContextualRule(prefix, input_, suffix, lookups)) @@ -1435,7 +1575,7 @@ class ChainContextualRulesetTest(object): # Third subtable has no pre/post context prefix, input_, suffix, lookups = [], [["E"]], [], [None] sb.rules.append(builder.ChainContextualRule(prefix, input_, suffix, lookups)) - prefix, input_, suffix, lookups = [], [["C","D"]], [], [None] + prefix, input_, suffix, lookups = [], [["C", "D"]], [], [None] sb.rules.append(builder.ChainContextualRule(prefix, input_, suffix, lookups)) rulesets = sb.rulesets() @@ -1443,7 +1583,7 @@ class ChainContextualRulesetTest(object): assert rulesets[0].hasPrefixOrSuffix assert not rulesets[0].hasAnyGlyphClasses cd = rulesets[0].format2ClassDefs() - assert set(cd[0].classes()[1:]) == set([("d",),("b",),("a",)]) + assert set(cd[0].classes()[1:]) == set([("d",), ("b",), ("a",)]) assert set(cd[1].classes()[1:]) == set([("c",)]) assert set(cd[2].classes()[1:]) == set() @@ -1456,7 +1596,7 @@ class ChainContextualRulesetTest(object): assert rulesets[2].format2ClassDefs() cd = rulesets[2].format2ClassDefs() assert set(cd[0].classes()[1:]) == set() - assert set(cd[1].classes()[1:]) == set([("C","D"), ("E",)]) + assert set(cd[1].classes()[1:]) == set([("C", "D"), ("E",)]) assert set(cd[2].classes()[1:]) == set() diff --git a/Tests/otlLib/optimize_test.py b/Tests/otlLib/optimize_test.py new file mode 100644 index 00000000..40cf389e --- /dev/null +++ b/Tests/otlLib/optimize_test.py @@ -0,0 +1,175 @@ +import logging +from pathlib import Path +from subprocess import run +import contextlib +import os +from typing import List, Optional, Tuple +from fontTools.ttLib import TTFont + +import pytest + +from fontTools.feaLib.builder import addOpenTypeFeaturesFromString +from fontTools.fontBuilder import FontBuilder + +from fontTools.ttLib.tables.otBase import OTTableWriter, ValueRecord + + +def test_main(tmpdir: Path): + """Check that calling the main function on an input TTF works.""" + glyphs = ".notdef space A Aacute B D".split() + features = """ + @A = [A Aacute]; + @B = [B D]; + feature kern { + pos @A @B -50; + } kern; + """ + fb = FontBuilder(1000) + fb.setupGlyphOrder(glyphs) + addOpenTypeFeaturesFromString(fb.font, features) + input = tmpdir / "in.ttf" + fb.save(str(input)) + output = tmpdir / "out.ttf" + run( + [ + "fonttools", + "otlLib.optimize", + "--gpos-compact-mode", + "5", + str(input), + "-o", + str(output), + ], + check=True, + ) + assert output.exists() + + +# Copy-pasted from https://stackoverflow.com/questions/2059482/python-temporarily-modify-the-current-processs-environment +# TODO: remove when moving to the Config class +@contextlib.contextmanager +def set_env(**environ): + """ + Temporarily set the process environment variables. + + >>> with set_env(PLUGINS_DIR=u'test/plugins'): + ... "PLUGINS_DIR" in os.environ + True + + >>> "PLUGINS_DIR" in os.environ + False + + :type environ: dict[str, unicode] + :param environ: Environment variables to set + """ + old_environ = dict(os.environ) + os.environ.update(environ) + try: + yield + finally: + os.environ.clear() + os.environ.update(old_environ) + + +def count_pairpos_subtables(font: TTFont) -> int: + subtables = 0 + for lookup in font["GPOS"].table.LookupList.Lookup: + if lookup.LookupType == 2: + subtables += len(lookup.SubTable) + elif lookup.LookupType == 9: + for subtable in lookup.SubTable: + if subtable.ExtensionLookupType == 2: + subtables += 1 + return subtables + + +def count_pairpos_bytes(font: TTFont) -> int: + bytes = 0 + gpos = font["GPOS"] + for lookup in font["GPOS"].table.LookupList.Lookup: + if lookup.LookupType == 2: + w = OTTableWriter(tableTag=gpos.tableTag) + lookup.compile(w, font) + bytes += len(w.getAllData()) + elif lookup.LookupType == 9: + if any(subtable.ExtensionLookupType == 2 for subtable in lookup.SubTable): + w = OTTableWriter(tableTag=gpos.tableTag) + lookup.compile(w, font) + bytes += len(w.getAllData()) + return bytes + + +def get_kerning_by_blocks(blocks: List[Tuple[int, int]]) -> Tuple[List[str], str]: + """Generate a highly compressible font by generating a bunch of rectangular + blocks on the diagonal that can easily be sliced into subtables. + + Returns the list of glyphs and feature code of the font. + """ + value = 0 + glyphs: List[str] = [] + rules = [] + # Each block is like a script in a multi-script font + for script, (width, height) in enumerate(blocks): + glyphs.extend(f"g_{script}_{i}" for i in range(max(width, height))) + for l in range(height): + for r in range(width): + value += 1 + rules.append((f"g_{script}_{l}", f"g_{script}_{r}", value)) + classes = "\n".join([f"@{g} = [{g}];" for g in glyphs]) + statements = "\n".join([f"pos @{l} @{r} {v};" for (l, r, v) in rules]) + features = f""" + {classes} + feature kern {{ + {statements} + }} kern; + """ + return glyphs, features + + +@pytest.mark.parametrize( + ("blocks", "mode", "expected_subtables", "expected_bytes"), + [ + # Mode = 0 = no optimization leads to 650 bytes of GPOS + ([(15, 3), (2, 10)], None, 1, 602), + # Optimization level 1 recognizes the 2 blocks and splits into 2 + # subtables = adds 1 subtable leading to a size reduction of + # (602-298)/602 = 50% + ([(15, 3), (2, 10)], 1, 2, 298), + # On a bigger block configuration, we see that mode=5 doesn't create + # as many subtables as it could, because of the stop criteria + ([(4, 4) for _ in range(20)], 5, 14, 2042), + # while level=9 creates as many subtables as there were blocks on the + # diagonal and yields a better saving + ([(4, 4) for _ in range(20)], 9, 20, 1886), + # On a fully occupied kerning matrix, even the strategy 9 doesn't + # split anything. + ([(10, 10)], 9, 1, 304) + ], +) +def test_optimization_mode( + caplog, + blocks: List[Tuple[int, int]], + mode: Optional[int], + expected_subtables: int, + expected_bytes: int, +): + """Check that the optimizations are off by default, and that increasing + the optimization level creates more subtables and a smaller byte size. + """ + caplog.set_level(logging.DEBUG) + + glyphs, features = get_kerning_by_blocks(blocks) + glyphs = [".notdef space"] + glyphs + + env = {} + if mode is not None: + # NOTE: activating this optimization via the environment variable is + # experimental and may not be supported once an alternative mechanism + # is in place. See: https://github.com/fonttools/fonttools/issues/2349 + env["FONTTOOLS_GPOS_COMPACT_MODE"] = str(mode) + with set_env(**env): + fb = FontBuilder(1000) + fb.setupGlyphOrder(glyphs) + addOpenTypeFeaturesFromString(fb.font, features) + assert expected_subtables == count_pairpos_subtables(fb.font) + assert expected_bytes == count_pairpos_bytes(fb.font) diff --git a/Tests/pens/data/test_even_odd_fill.pgm b/Tests/pens/data/test_even_odd_fill.pgm new file mode 100644 index 00000000..70130f33 Binary files /dev/null and b/Tests/pens/data/test_even_odd_fill.pgm differ diff --git a/Tests/pens/data/test_non_zero_fill.pgm b/Tests/pens/data/test_non_zero_fill.pgm new file mode 100644 index 00000000..698f6424 Binary files /dev/null and b/Tests/pens/data/test_non_zero_fill.pgm differ diff --git a/Tests/pens/data/test_rotate.pgm b/Tests/pens/data/test_rotate.pgm new file mode 100644 index 00000000..14edd9fc Binary files /dev/null and b/Tests/pens/data/test_rotate.pgm differ diff --git a/Tests/pens/data/test_skew.pgm b/Tests/pens/data/test_skew.pgm new file mode 100644 index 00000000..5ba4a067 Binary files /dev/null and b/Tests/pens/data/test_skew.pgm differ diff --git a/Tests/pens/freetypePen_test.py b/Tests/pens/freetypePen_test.py new file mode 100644 index 00000000..b6edc8bb --- /dev/null +++ b/Tests/pens/freetypePen_test.py @@ -0,0 +1,235 @@ +import unittest +import os +import math + +try: + from fontTools.pens.freetypePen import FreeTypePen + + FREETYPE_PY_AVAILABLE = True +except ImportError: + FREETYPE_PY_AVAILABLE = False + +from fontTools.misc.transform import Scale, Offset + +DATA_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "data") + + +def box(pen, offset=(0, 0)): + pen.moveTo((0 + offset[0], 0 + offset[1])) + pen.lineTo((0 + offset[0], 500 + offset[1])) + pen.lineTo((500 + offset[0], 500 + offset[1])) + pen.lineTo((500 + offset[0], 0 + offset[1])) + pen.closePath() + + +def draw_cubic(pen): + pen.moveTo((50, 0)) + pen.lineTo((50, 500)) + pen.lineTo((200, 500)) + pen.curveTo((350, 500), (450, 400), (450, 250)) + pen.curveTo((450, 100), (350, 0), (200, 0)) + pen.closePath() + + +def draw_quadratic(pen): + pen.moveTo((50, 0)) + pen.lineTo((50, 500)) + pen.lineTo((200, 500)) + pen.qCurveTo((274, 500), (388, 438), (450, 324), (450, 250)) + pen.qCurveTo((450, 176), (388, 62), (274, 0), (200, 0)) + pen.closePath() + + +def star(pen): + pen.moveTo((0, 420)) + pen.lineTo((1000, 420)) + pen.lineTo((200, -200)) + pen.lineTo((500, 800)) + pen.lineTo((800, -200)) + pen.closePath() + + +# For the PGM format, see the following resources: +# https://en.wikipedia.org/wiki/Netpbm +# http://netpbm.sourceforge.net/doc/pgm.html +def load_pgm(filename): + with open(filename, "rb") as fp: + assert fp.readline() == "P5\n".encode() + w, h = (int(c) for c in fp.readline().decode().rstrip().split(" ")) + assert fp.readline() == "255\n".encode() + return fp.read(), (w, h) + + +def save_pgm(filename, buf, size): + with open(filename, "wb") as fp: + fp.write("P5\n".encode()) + fp.write("{0:d} {1:d}\n".format(*size).encode()) + fp.write("255\n".encode()) + fp.write(buf) + + +# Assume the buffers are equal when PSNR > 38dB. See also: +# Peak signal-to-noise ratio +# https://en.wikipedia.org/wiki/Peak_signal-to-noise_ratio +PSNR_THRESHOLD = 38.0 + + +def psnr(b1, b2): + import math + + mse = sum((c1 - c2) * (c1 - c2) for c1, c2 in zip(b1, b2)) / float(len(b1)) + return 10.0 * math.log10((255.0**2) / float(mse)) if mse > 0 else math.inf + + +@unittest.skipUnless(FREETYPE_PY_AVAILABLE, "freetype-py not installed") +class FreeTypePenTest(unittest.TestCase): + def test_draw(self): + pen = FreeTypePen(None) + box(pen) + width, height = 500, 500 + buf1, _ = pen.buffer(width=width, height=height) + buf2 = b"\xff" * width * height + self.assertEqual(buf1, buf2) + + def test_empty(self): + pen = FreeTypePen(None) + width, height = 500, 500 + buf, size = pen.buffer(width=width, height=height) + self.assertEqual(b"\0" * size[0] * size[1], buf) + + def test_bbox_and_cbox(self): + pen = FreeTypePen(None) + draw_cubic(pen) + self.assertEqual(pen.bbox, (50.0, 0.0, 450.0, 500.0)) + self.assertEqual(pen.cbox, (50.0, 0.0, 450.0, 500.0)) + + def test_non_zero_fill(self): + pen = FreeTypePen(None) + star(pen) + t = Scale(0.05, 0.05) + width, height = t.transformPoint((1000, 1000)) + t = t.translate(0, 200) + buf1, size1 = pen.buffer(width=width, height=height, transform=t, evenOdd=False) + buf2, size2 = load_pgm(os.path.join(DATA_DIR, "test_non_zero_fill.pgm")) + self.assertEqual(len(buf1), len(buf2)) + self.assertEqual(size1, size2) + self.assertGreater(psnr(buf1, buf2), PSNR_THRESHOLD) + + def test_even_odd_fill(self): + pen = FreeTypePen(None) + star(pen) + t = Scale(0.05, 0.05) + width, height = t.transformPoint((1000, 1000)) + t = t.translate(0, 200) + buf1, size1 = pen.buffer(width=width, height=height, transform=t, evenOdd=True) + buf2, size2 = load_pgm(os.path.join(DATA_DIR, "test_even_odd_fill.pgm")) + self.assertEqual(len(buf1), len(buf2)) + self.assertEqual(size1, size2) + self.assertGreater(psnr(buf1, buf2), PSNR_THRESHOLD) + + def test_cubic_vs_quadratic(self): + pen1, pen2 = FreeTypePen(None), FreeTypePen(None) + draw_cubic(pen1) + draw_quadratic(pen2) + width, height = 500, 500 + buf1, _ = pen1.buffer(width=width, height=height) + buf2, _ = pen2.buffer(width=width, height=height) + self.assertEqual(len(buf1), len(buf2)) + self.assertGreater(psnr(buf1, buf2), PSNR_THRESHOLD) + + def test_contain(self): + pen = FreeTypePen(None) + star(pen) + t = Scale(0.05, 0.05) + width, height = 0, 0 + buf1, size1 = pen.buffer(width=width, height=height, transform=t, contain=True) + buf2, size2 = load_pgm(os.path.join(DATA_DIR, "test_non_zero_fill.pgm")) + self.assertEqual(len(buf1), len(buf2)) + self.assertEqual(size1, size2) + self.assertGreater(psnr(buf1, buf2), PSNR_THRESHOLD) + + def test_rotate(self): + pen = FreeTypePen(None) + box(pen) + t = Scale(0.05, 0.05).rotate(math.pi / 4.0).translate(1234, 5678) + width, height = None, None + buf1, size1 = pen.buffer(width=width, height=height, transform=t) + buf2, size2 = load_pgm(os.path.join(DATA_DIR, "test_rotate.pgm")) + self.assertEqual(len(buf1), len(buf2)) + self.assertEqual(size1, size2) + self.assertGreater(psnr(buf1, buf2), PSNR_THRESHOLD) + + def test_skew(self): + pen = FreeTypePen(None) + box(pen) + t = Scale(0.05, 0.05).skew(math.pi / 4.0).translate(1234, 5678) + width, height = None, None + buf1, size1 = pen.buffer(width=width, height=height, transform=t) + buf2, size2 = load_pgm(os.path.join(DATA_DIR, "test_skew.pgm")) + self.assertEqual(len(buf1), len(buf2)) + self.assertEqual(size1, size2) + self.assertGreater(psnr(buf1, buf2), PSNR_THRESHOLD) + + def test_none_size(self): + pen = FreeTypePen(None) + star(pen) + width, height = None, None + buf1, size = pen.buffer(width=width, height=height, transform=Offset(0, 200)) + buf2, _ = pen.buffer(width=1000, height=1000, transform=Offset(0, 200)) + self.assertEqual(size, (1000, 1000)) + self.assertEqual(buf1, buf2) + + pen = FreeTypePen(None) + box(pen, offset=(250, 250)) + width, height = None, None + buf1, size = pen.buffer(width=width, height=height) + buf2, _ = pen.buffer(width=500, height=500, transform=Offset(-250, -250)) + self.assertEqual(size, (500, 500)) + self.assertEqual(buf1, buf2) + + pen = FreeTypePen(None) + box(pen, offset=(-1234, -5678)) + width, height = None, None + buf1, size = pen.buffer(width=width, height=height) + buf2, _ = pen.buffer(width=500, height=500, transform=Offset(1234, 5678)) + self.assertEqual(size, (500, 500)) + self.assertEqual(buf1, buf2) + + def test_zero_size(self): + pen = FreeTypePen(None) + star(pen) + width, height = 0, 0 + buf1, size = pen.buffer( + width=width, height=height, transform=Offset(0, 200), contain=True + ) + buf2, _ = pen.buffer( + width=1000, height=1000, transform=Offset(0, 200), contain=True + ) + self.assertEqual(size, (1000, 1000)) + self.assertEqual(buf1, buf2) + + pen = FreeTypePen(None) + box(pen, offset=(250, 250)) + width, height = 0, 0 + buf1, size = pen.buffer(width=width, height=height, contain=True) + buf2, _ = pen.buffer( + width=500, height=500, transform=Offset(0, 0), contain=True + ) + self.assertEqual(size, (750, 750)) + self.assertEqual(buf1, buf2) + + pen = FreeTypePen(None) + box(pen, offset=(-1234, -5678)) + width, height = 0, 0 + buf1, size = pen.buffer(width=width, height=height, contain=True) + buf2, _ = pen.buffer( + width=500, height=500, transform=Offset(1234, 5678), contain=True + ) + self.assertEqual(size, (500, 500)) + self.assertEqual(buf1, buf2) + + +if __name__ == "__main__": + import sys + + sys.exit(unittest.main()) diff --git a/Tests/pens/ttGlyphPen_test.py b/Tests/pens/ttGlyphPen_test.py index 53db025c..96d75a19 100644 --- a/Tests/pens/ttGlyphPen_test.py +++ b/Tests/pens/ttGlyphPen_test.py @@ -1,56 +1,63 @@ import os -import unittest +import pytest import struct from fontTools import ttLib -from fontTools.misc.testTools import TestCase -from fontTools.pens.ttGlyphPen import TTGlyphPen, MAX_F2DOT14 +from fontTools.pens.basePen import PenError +from fontTools.pens.ttGlyphPen import TTGlyphPen, TTGlyphPointPen, MAX_F2DOT14 -class TTGlyphPenTest(TestCase): - +class TTGlyphPenTestBase: def runEndToEnd(self, filename): font = ttLib.TTFont() ttx_path = os.path.join( os.path.abspath(os.path.dirname(os.path.realpath(__file__))), - '..', 'ttLib', 'data', filename) + "..", + "ttLib", + "data", + filename, + ) font.importXML(ttx_path) glyphSet = font.getGlyphSet() - glyfTable = font['glyf'] - pen = TTGlyphPen(font.getGlyphSet()) + glyfTable = font["glyf"] + pen = self.penClass(font.getGlyphSet()) for name in font.getGlyphOrder(): oldGlyph = glyphSet[name] - oldGlyph.draw(pen) + getattr(oldGlyph, self.drawMethod)(pen) oldGlyph = oldGlyph._glyph newGlyph = pen.glyph() - if hasattr(oldGlyph, 'program'): + if hasattr(oldGlyph, "program"): newGlyph.program = oldGlyph.program - self.assertEqual( - oldGlyph.compile(glyfTable), newGlyph.compile(glyfTable)) + assert oldGlyph.compile(glyfTable) == newGlyph.compile(glyfTable) def test_e2e_linesAndSimpleComponents(self): - self.runEndToEnd('TestTTF-Regular.ttx') + self.runEndToEnd("TestTTF-Regular.ttx") def test_e2e_curvesAndComponentTransforms(self): - self.runEndToEnd('TestTTFComplex-Regular.ttx') + self.runEndToEnd("TestTTFComplex-Regular.ttx") + + +class TTGlyphPenTest(TTGlyphPenTestBase): + penClass = TTGlyphPen + drawMethod = "draw" def test_moveTo_errorWithinContour(self): pen = TTGlyphPen(None) pen.moveTo((0, 0)) - with self.assertRaises(AssertionError): + with pytest.raises(PenError): pen.moveTo((1, 0)) def test_closePath_ignoresAnchors(self): pen = TTGlyphPen(None) pen.moveTo((0, 0)) pen.closePath() - self.assertFalse(pen.points) - self.assertFalse(pen.types) - self.assertFalse(pen.endPts) + assert not pen.points + assert not pen.types + assert not pen.endPts def test_endPath_sameAsClosePath(self): pen = TTGlyphPen(None) @@ -67,16 +74,16 @@ class TTGlyphPenTest(TestCase): pen.endPath() endPathGlyph = pen.glyph() - self.assertEqual(closePathGlyph, endPathGlyph) + assert closePathGlyph == endPathGlyph def test_glyph_errorOnUnendedContour(self): pen = TTGlyphPen(None) pen.moveTo((0, 0)) - with self.assertRaises(AssertionError): + with pytest.raises(PenError): pen.glyph() def test_glyph_decomposes(self): - componentName = 'a' + componentName = "a" glyphSet = {} pen = TTGlyphPen(glyphSet) @@ -104,7 +111,7 @@ class TTGlyphPenTest(TestCase): pen.closePath() plainGlyph = pen.glyph() - self.assertEqual(plainGlyph, compositeGlyph) + assert plainGlyph == compositeGlyph def test_remove_extra_move_points(self): pen = TTGlyphPen(None) @@ -112,8 +119,8 @@ class TTGlyphPenTest(TestCase): pen.lineTo((100, 0)) pen.qCurveTo((100, 50), (50, 100), (0, 0)) pen.closePath() - self.assertEqual(len(pen.points), 4) - self.assertEqual(pen.points[0], (0, 0)) + assert len(pen.points) == 4 + assert pen.points[0] == (0, 0) def test_keep_move_point(self): pen = TTGlyphPen(None) @@ -122,8 +129,8 @@ class TTGlyphPenTest(TestCase): pen.qCurveTo((100, 50), (50, 100), (30, 30)) # when last and move pts are different, closePath() implies a lineTo pen.closePath() - self.assertEqual(len(pen.points), 5) - self.assertEqual(pen.points[0], (0, 0)) + assert len(pen.points) == 5 + assert pen.points[0] == (0, 0) def test_keep_duplicate_end_point(self): pen = TTGlyphPen(None) @@ -132,11 +139,11 @@ class TTGlyphPenTest(TestCase): pen.qCurveTo((100, 50), (50, 100), (0, 0)) pen.lineTo((0, 0)) # the duplicate point is not removed pen.closePath() - self.assertEqual(len(pen.points), 5) - self.assertEqual(pen.points[0], (0, 0)) + assert len(pen.points) == 5 + assert pen.points[0] == (0, 0) def test_within_range_component_transform(self): - componentName = 'a' + componentName = "a" glyphSet = {} pen = TTGlyphPen(glyphSet) @@ -154,10 +161,10 @@ class TTGlyphPenTest(TestCase): pen.addComponent(componentName, (1, 0, 0, -1.5, 0, 0)) expectedGlyph = pen.glyph() - self.assertEqual(expectedGlyph, compositeGlyph) + assert expectedGlyph == compositeGlyph def test_clamp_to_almost_2_component_transform(self): - componentName = 'a' + componentName = "a" glyphSet = {} pen = TTGlyphPen(glyphSet) @@ -182,10 +189,10 @@ class TTGlyphPenTest(TestCase): pen.addComponent(componentName, (-2, 0, 0, -2, 0, 0)) expectedGlyph = pen.glyph() - self.assertEqual(expectedGlyph, compositeGlyph) + assert expectedGlyph == compositeGlyph def test_out_of_range_transform_decomposed(self): - componentName = 'a' + componentName = "a" glyphSet = {} pen = TTGlyphPen(glyphSet) @@ -214,10 +221,10 @@ class TTGlyphPenTest(TestCase): pen.closePath() expectedGlyph = pen.glyph() - self.assertEqual(expectedGlyph, compositeGlyph) + assert expectedGlyph == compositeGlyph def test_no_handle_overflowing_transform(self): - componentName = 'a' + componentName = "a" glyphSet = {} pen = TTGlyphPen(glyphSet, handleOverflowingTransforms=False) @@ -231,14 +238,13 @@ class TTGlyphPenTest(TestCase): pen.addComponent(componentName, (3, 0, 0, 1, 0, 0)) compositeGlyph = pen.glyph() - self.assertEqual(compositeGlyph.components[0].transform, - ((3, 0), (0, 1))) + assert compositeGlyph.components[0].transform == ((3, 0), (0, 1)) - with self.assertRaises(struct.error): - compositeGlyph.compile({'a': baseGlyph}) + with pytest.raises(struct.error): + compositeGlyph.compile({"a": baseGlyph}) def assertGlyphBoundsEqual(self, glyph, bounds): - self.assertEqual((glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax), bounds) + assert (glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax) == bounds def test_round_float_coordinates_and_component_offsets(self): glyphSet = {} @@ -253,7 +259,7 @@ class TTGlyphPenTest(TestCase): simpleGlyph.recalcBounds(glyphSet) self.assertGlyphBoundsEqual(simpleGlyph, (0, 0, 368, 1)) - componentName = 'a' + componentName = "a" glyphSet[componentName] = simpleGlyph pen.addComponent(componentName, (1, 0, 0, 1, -86.4, 0)) @@ -271,7 +277,7 @@ class TTGlyphPenTest(TestCase): pen.lineTo((-55, 745)) pen.lineTo((-231, 745)) pen.closePath() - glyphSet["gravecomb"] = gravecomb = pen.glyph() + glyphSet["gravecomb"] = pen.glyph() pen = TTGlyphPen(glyphSet) pen.moveTo((-278, 939)) @@ -279,7 +285,7 @@ class TTGlyphPenTest(TestCase): pen.lineTo((8, 745)) pen.lineTo((-278, 745)) pen.closePath() - glyphSet["circumflexcomb"] = circumflexcomb = pen.glyph() + glyphSet["circumflexcomb"] = pen.glyph() pen = TTGlyphPen(glyphSet) pen.addComponent("circumflexcomb", (1, 0, 0, 1, 0, 0)) @@ -290,6 +296,286 @@ class TTGlyphPenTest(TestCase): self.assertGlyphBoundsEqual(uni0302_uni0300, (-278, 745, 148, 1025)) +class TTGlyphPointPenTest(TTGlyphPenTestBase): + penClass = TTGlyphPointPen + drawMethod = "drawPoints" + + def test_glyph_simple(self): + pen = TTGlyphPointPen(None) + pen.beginPath() + pen.addPoint((50, 0), "line") + pen.addPoint((450, 0), "line") + pen.addPoint((450, 700), "line") + pen.addPoint((50, 700), "line") + pen.endPath() + glyph = pen.glyph() + assert glyph.numberOfContours == 1 + assert glyph.endPtsOfContours == [3] + + def test_addPoint_errorOnCurve(self): + pen = TTGlyphPointPen(None) + pen.beginPath() + with pytest.raises(NotImplementedError): + pen.addPoint((0, 0), "curve") + + def test_beginPath_beginPathOnOpenPath(self): + pen = TTGlyphPointPen(None) + pen.beginPath() + pen.addPoint((0, 0)) + with pytest.raises(PenError): + pen.beginPath() + + def test_glyph_errorOnUnendedContour(self): + pen = TTGlyphPointPen(None) + pen.beginPath() + pen.addPoint((0, 0)) + with pytest.raises(PenError): + pen.glyph() + + def test_glyph_errorOnEmptyContour(self): + pen = TTGlyphPointPen(None) + pen.beginPath() + with pytest.raises(PenError): + pen.endPath() + + def test_glyph_decomposes(self): + componentName = "a" + glyphSet = {} + pen = TTGlyphPointPen(glyphSet) + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((1, 0), "line") + pen.endPath() + glyphSet[componentName] = _TestGlyph(pen.glyph()) + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((1, 0), "line") + pen.endPath() + pen.addComponent(componentName, (1, 0, 0, 1, 2, 0)) + pen.addComponent("missing", (1, 0, 0, 1, 0, 0)) # skipped + compositeGlyph = pen.glyph() + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((1, 0), "line") + pen.endPath() + pen.beginPath() + pen.addPoint((2, 0), "line") + pen.addPoint((2, 1), "line") + pen.addPoint((3, 0), "line") + pen.endPath() + plainGlyph = pen.glyph() + + assert plainGlyph == compositeGlyph + + def test_keep_duplicate_end_point(self): + pen = TTGlyphPointPen(None) + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((100, 0), "line") + pen.addPoint((100, 50)) + pen.addPoint((50, 100)) + pen.addPoint((0, 0), "qcurve") + pen.addPoint((0, 0), "line") # the duplicate point is not removed + pen.endPath() + assert len(pen.points) == 6 + assert pen.points[0] == (0, 0) + + def test_within_range_component_transform(self): + componentName = "a" + glyphSet = {} + pen = TTGlyphPointPen(glyphSet) + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((1, 0), "line") + pen.endPath() + glyphSet[componentName] = _TestGlyph(pen.glyph()) + + pen.addComponent(componentName, (1.5, 0, 0, 1, 0, 0)) + pen.addComponent(componentName, (1, 0, 0, -1.5, 0, 0)) + compositeGlyph = pen.glyph() + + pen.addComponent(componentName, (1.5, 0, 0, 1, 0, 0)) + pen.addComponent(componentName, (1, 0, 0, -1.5, 0, 0)) + expectedGlyph = pen.glyph() + + assert expectedGlyph == compositeGlyph + + def test_clamp_to_almost_2_component_transform(self): + componentName = "a" + glyphSet = {} + pen = TTGlyphPointPen(glyphSet) + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((1, 0), "line") + pen.endPath() + glyphSet[componentName] = _TestGlyph(pen.glyph()) + + pen.addComponent(componentName, (1.99999, 0, 0, 1, 0, 0)) + pen.addComponent(componentName, (1, 2, 0, 1, 0, 0)) + pen.addComponent(componentName, (1, 0, 2, 1, 0, 0)) + pen.addComponent(componentName, (1, 0, 0, 2, 0, 0)) + pen.addComponent(componentName, (-2, 0, 0, -2, 0, 0)) + compositeGlyph = pen.glyph() + + almost2 = MAX_F2DOT14 # 0b1.11111111111111 + pen.addComponent(componentName, (almost2, 0, 0, 1, 0, 0)) + pen.addComponent(componentName, (1, almost2, 0, 1, 0, 0)) + pen.addComponent(componentName, (1, 0, almost2, 1, 0, 0)) + pen.addComponent(componentName, (1, 0, 0, almost2, 0, 0)) + pen.addComponent(componentName, (-2, 0, 0, -2, 0, 0)) + expectedGlyph = pen.glyph() + + assert expectedGlyph == compositeGlyph + + def test_out_of_range_transform_decomposed(self): + componentName = "a" + glyphSet = {} + pen = TTGlyphPointPen(glyphSet) + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((1, 0), "line") + pen.endPath() + glyphSet[componentName] = _TestGlyph(pen.glyph()) + + pen.addComponent(componentName, (3, 0, 0, 2, 0, 0)) + pen.addComponent(componentName, (1, 0, 0, 1, -1, 2)) + pen.addComponent(componentName, (2, 0, 0, -3, 0, 0)) + compositeGlyph = pen.glyph() + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 2), "line") + pen.addPoint((3, 0), "line") + pen.endPath() + pen.beginPath() + pen.addPoint((-1, 2), "line") + pen.addPoint((-1, 3), "line") + pen.addPoint((0, 2), "line") + pen.endPath() + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, -3), "line") + pen.addPoint((2, 0), "line") + pen.endPath() + expectedGlyph = pen.glyph() + + assert expectedGlyph == compositeGlyph + + def test_no_handle_overflowing_transform(self): + componentName = "a" + glyphSet = {} + pen = TTGlyphPointPen(glyphSet, handleOverflowingTransforms=False) + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((1, 0), "line") + pen.endPath() + baseGlyph = pen.glyph() + glyphSet[componentName] = _TestGlyph(baseGlyph) + + pen.addComponent(componentName, (3, 0, 0, 1, 0, 0)) + compositeGlyph = pen.glyph() + + assert compositeGlyph.components[0].transform == ((3, 0), (0, 1)) + + with pytest.raises(struct.error): + compositeGlyph.compile({"a": baseGlyph}) + + def assertGlyphBoundsEqual(self, glyph, bounds): + assert (glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax) == bounds + + def test_round_float_coordinates_and_component_offsets(self): + glyphSet = {} + pen = TTGlyphPointPen(glyphSet) + + pen.beginPath() + pen.addPoint((0, 0), "line") + pen.addPoint((0, 1), "line") + pen.addPoint((367.6, 0), "line") + pen.endPath() + simpleGlyph = pen.glyph() + + simpleGlyph.recalcBounds(glyphSet) + self.assertGlyphBoundsEqual(simpleGlyph, (0, 0, 368, 1)) + + componentName = "a" + glyphSet[componentName] = simpleGlyph + + pen.addComponent(componentName, (1, 0, 0, 1, -86.4, 0)) + compositeGlyph = pen.glyph() + + compositeGlyph.recalcBounds(glyphSet) + self.assertGlyphBoundsEqual(compositeGlyph, (-86, 0, 282, 1)) + + def test_scaled_component_bounds(self): + glyphSet = {} + + pen = TTGlyphPointPen(glyphSet) + pen.beginPath() + pen.addPoint((-231, 939), "line") + pen.addPoint((-55, 939), "line") + pen.addPoint((-55, 745), "line") + pen.addPoint((-231, 745), "line") + pen.endPath() + glyphSet["gravecomb"] = pen.glyph() + + pen = TTGlyphPointPen(glyphSet) + pen.beginPath() + pen.addPoint((-278, 939), "line") + pen.addPoint((8, 939), "line") + pen.addPoint((8, 745), "line") + pen.addPoint((-278, 745), "line") + pen.endPath() + glyphSet["circumflexcomb"] = pen.glyph() + + pen = TTGlyphPointPen(glyphSet) + pen.addComponent("circumflexcomb", (1, 0, 0, 1, 0, 0)) + pen.addComponent("gravecomb", (0.9, 0, 0, 0.9, 198, 180)) + glyphSet["uni0302_uni0300"] = uni0302_uni0300 = pen.glyph() + + uni0302_uni0300.recalcBounds(glyphSet) + self.assertGlyphBoundsEqual(uni0302_uni0300, (-278, 745, 148, 1025)) + + def test_open_path_starting_with_move(self): + # when a contour starts with a 'move' point, it signifies the beginnig + # of an open contour. + # https://unifiedfontobject.org/versions/ufo3/glyphs/glif/#point-types + pen1 = TTGlyphPointPen(None) + pen1.beginPath() + pen1.addPoint((0, 0), "move") # contour is open + pen1.addPoint((10, 10), "line") + pen1.addPoint((20, 20)) + pen1.addPoint((20, 0), "qcurve") + pen1.endPath() + + pen2 = TTGlyphPointPen(None) + pen2.beginPath() + pen2.addPoint((0, 0), "line") # contour is closed + pen2.addPoint((10, 10), "line") + pen2.addPoint((20, 20)) + pen2.addPoint((20, 0), "qcurve") + pen2.endPath() + + # Since TrueType contours are always implicitly closed, the pen will + # interpret both these paths as equivalent + assert pen1.points == pen2.points == [(0, 0), (10, 10), (20, 20), (20, 0)] + assert pen1.types == pen2.types == [1, 1, 0, 1] + + + class _TestGlyph(object): def __init__(self, glyph): self.coordinates = glyph.coordinates @@ -300,7 +586,8 @@ class _TestGlyph(object): pen.lineTo(point) pen.closePath() - -if __name__ == '__main__': - import sys - sys.exit(unittest.main()) + def drawPoints(self, pen): + pen.beginPath() + for point in self.coordinates: + pen.addPoint(point, "line") + pen.endPath() diff --git a/Tests/subset/data/BungeeColor-Regular.ttx b/Tests/subset/data/BungeeColor-Regular.ttx new file mode 100644 index 00000000..d14c8922 --- /dev/null +++ b/Tests/subset/data/BungeeColor-Regular.ttx @@ -0,0 +1,438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copyright 2008 The Bungee Project Authors (david@djr.com) + + + Bungee Color Regular + + + Regular + + + 1.000;djr ;BungeeColor-Regular + + + Bungee Color Regular Regular + + + Version 1.000;PS 1.0;hotconv 1.0.72;makeotf.lib2.5.5900 + + + BungeeColor-Regular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.subset.ttx b/Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.subset.ttx new file mode 100644 index 00000000..7eee95fe --- /dev/null +++ b/Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.subset.ttx @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.ttx b/Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.ttx new file mode 100644 index 00000000..91496372 --- /dev/null +++ b/Tests/subset/data/GPOS_SinglePos_no_value_issue_2312.ttx @@ -0,0 +1,689 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copyright 2019 Google Inc. All Rights Reserved. + + + Noto Sans Siddham + + + Regular + + + 2.001;GOOG;NotoSansSiddham-Regular + + + Noto Sans Siddham Regular + + + Version 2.001 + + + NotoSansSiddham-Regular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/subset/subset_test.py b/Tests/subset/subset_test.py index 6fa1bf60..d195af0f 100644 --- a/Tests/subset/subset_test.py +++ b/Tests/subset/subset_test.py @@ -1,12 +1,13 @@ import io -from fontTools.misc.py23 import tobytes, tostr from fontTools.misc.testTools import getXML +from fontTools.misc.textTools import tobytes, tostr from fontTools import subset from fontTools.fontBuilder import FontBuilder from fontTools.pens.ttGlyphPen import TTGlyphPen from fontTools.ttLib import TTFont, newTable from fontTools.ttLib.tables import otTables as ot from fontTools.misc.loggingTools import CapturingLogHandler +from fontTools.subset.svg import etree import difflib import logging import os @@ -50,12 +51,11 @@ class SubsetTest(unittest.TestCase): lines = [] with open(path, "r", encoding="utf-8") as ttx: for line in ttx.readlines(): - # Elide ttFont attributes because ttLibVersion may change, - # and use os-native line separators so we can run difflib. + # Elide ttFont attributes because ttLibVersion may change. if line.startswith("" + os.linesep) + lines.append("\n") else: - lines.append(line.rstrip() + os.linesep) + lines.append(line.rstrip() + "\n") return lines def expect_ttx(self, font, expected_ttx, tables=None): @@ -793,6 +793,19 @@ class SubsetTest(unittest.TestCase): subsetfont = TTFont(subsetpath) self.expect_ttx(subsetfont, expected_ttx, ["GPOS"]) + def test_GPOS_SinglePos_prune_post_subset_no_value(self): + _, fontpath = self.compile_font( + self.getpath("GPOS_SinglePos_no_value_issue_2312.ttx"), ".ttf" + ) + subsetpath = self.temp_path(".ttf") + subset.main([fontpath, "*", "--glyph-names", "--output-file=%s" % subsetpath]) + subsetfont = TTFont(subsetpath) + self.expect_ttx( + subsetfont, + self.getpath("GPOS_SinglePos_no_value_issue_2312.subset.ttx"), + ["GlyphOrder", "GPOS"], + ) + @pytest.fixture def featureVarsTestFont(): @@ -1000,7 +1013,7 @@ def colrv1_path(tmp_path): }, { "Format": ot.PaintFormat.PaintGlyph, - "Paint": (ot.PaintFormat.PaintSolid, (2, 0.3)), + "Paint": (ot.PaintFormat.PaintSolid, 2, 0.3), "Glyph": "glyph00011", }, ], @@ -1031,7 +1044,7 @@ def colrv1_path(tmp_path): }, { "Format": ot.PaintFormat.PaintGlyph, - "Paint": (ot.PaintFormat.PaintSolid, (1, 0.5)), + "Paint": (ot.PaintFormat.PaintSolid, 1, 0.5), "Glyph": "glyph00013", }, ], @@ -1065,7 +1078,7 @@ def colrv1_path(tmp_path): ], ), "uniE003": { - "Format": ot.PaintFormat.PaintRotate, + "Format": ot.PaintFormat.PaintRotateAroundCenter, "Paint": { "Format": ot.PaintFormat.PaintColrGlyph, "Glyph": "uniE001", @@ -1076,9 +1089,16 @@ def colrv1_path(tmp_path): }, "uniE004": [ ("glyph00016", 1), - ("glyph00017", 2), + ("glyph00017", 0xFFFF), # special palette index for foreground text + ("glyph00018", 2), ], }, + clipBoxes={ + "uniE000": (0, 0, 200, 300), + "uniE001": (0, 0, 500, 500), + "uniE002": (100, 100, 400, 400), + "uniE003": (-50, -50, 350, 350), + }, ) fb.setupCPAL( [ @@ -1130,31 +1150,36 @@ def test_subset_COLRv1_and_CPAL(colrv1_path): assert "uniE004" in glyph_set assert "glyph00016" in glyph_set assert "glyph00017" in glyph_set + assert "glyph00018" in glyph_set assert "COLR" in subset_font colr = subset_font["COLR"].table assert colr.Version == 1 assert len(colr.BaseGlyphRecordArray.BaseGlyphRecord) == 1 - assert len(colr.BaseGlyphV1List.BaseGlyphV1Record) == 3 # was 4 + assert len(colr.BaseGlyphList.BaseGlyphPaintRecord) == 3 # was 4 - base = colr.BaseGlyphV1List.BaseGlyphV1Record[0] + base = colr.BaseGlyphList.BaseGlyphPaintRecord[0] assert base.BaseGlyph == "uniE001" - layers = colr.LayerV1List.Paint[ + layers = colr.LayerList.Paint[ base.Paint.FirstLayerIndex: base.Paint.FirstLayerIndex + base.Paint.NumLayers ] assert len(layers) == 2 # check v1 palette indices were remapped - assert layers[0].Paint.Paint.ColorLine.ColorStop[0].Color.PaletteIndex == 0 - assert layers[0].Paint.Paint.ColorLine.ColorStop[1].Color.PaletteIndex == 1 - assert layers[1].Paint.Color.PaletteIndex == 0 + assert layers[0].Paint.Paint.ColorLine.ColorStop[0].PaletteIndex == 0 + assert layers[0].Paint.Paint.ColorLine.ColorStop[1].PaletteIndex == 1 + assert layers[1].Paint.PaletteIndex == 0 baseRecV0 = colr.BaseGlyphRecordArray.BaseGlyphRecord[0] assert baseRecV0.BaseGlyph == "uniE004" layersV0 = colr.LayerRecordArray.LayerRecord - assert len(layersV0) == 2 - # check v0 palette indices were remapped + assert len(layersV0) == 3 + # check v0 palette indices were remapped (except for 0xFFFF) assert layersV0[0].PaletteIndex == 0 - assert layersV0[1].PaletteIndex == 1 + assert layersV0[1].PaletteIndex == 0xFFFF + assert layersV0[2].PaletteIndex == 1 + + clipBoxes = colr.ClipList.clips + assert {"uniE001", "uniE002", "uniE003"} == set(clipBoxes) assert "CPAL" in subset_font cpal = subset_font["CPAL"] @@ -1208,11 +1233,173 @@ def test_subset_COLRv1_downgrade_version(colrv1_path): "uniE004", "glyph00016", "glyph00017", + "glyph00018", } assert "COLR" in subset_font assert subset_font["COLR"].version == 0 +def test_subset_COLRv1_drop_all_v0_glyphs(colrv1_path): + subset_path = colrv1_path.parent / (colrv1_path.name + ".subset") + + subset.main( + [ + str(colrv1_path), + "--glyph-names", + f"--output-file={subset_path}", + "--unicodes=E003", + ] + ) + subset_font = TTFont(subset_path) + + assert set(subset_font.getGlyphOrder()) == { + ".notdef", + "uniE001", + "uniE003", + "glyph00012", + "glyph00013", + } + + assert "COLR" in subset_font + colr = subset_font["COLR"] + assert colr.version == 1 + assert colr.table.BaseGlyphRecordCount == 0 + assert colr.table.BaseGlyphRecordArray is None + assert colr.table.LayerRecordArray is None + assert colr.table.LayerRecordCount is 0 + + +def test_subset_COLRv1_no_ClipList(colrv1_path): + font = TTFont(colrv1_path) + font["COLR"].table.ClipList = None # empty ClipList + font.save(colrv1_path) + + subset_path = colrv1_path.parent / (colrv1_path.name + ".subset") + subset.main( + [ + str(colrv1_path), + f"--output-file={subset_path}", + "--unicodes=*", + ] + ) + subset_font = TTFont(subset_path) + assert subset_font["COLR"].table.ClipList is None + + +def test_subset_keep_size_drop_empty_stylistic_set(): + fb = FontBuilder(unitsPerEm=1000, isTTF=True) + glyph_order = [".notdef", "a", "b", "b.ss01"] + fb.setupGlyphOrder(glyph_order) + fb.setupGlyf({g: TTGlyphPen(None).glyph() for g in glyph_order}) + fb.setupCharacterMap({ord("a"): "a", ord("b"): "b"}) + fb.setupHorizontalMetrics({g: (500, 0) for g in glyph_order}) + fb.setupHorizontalHeader() + fb.setupOS2() + fb.setupPost() + fb.setupNameTable({"familyName": "TestKeepSizeFeature", "styleName": "Regular"}) + fb.addOpenTypeFeatures(""" + feature size { + parameters 10.0 0; + } size; + feature ss01 { + featureNames { + name "Alternate b"; + }; + sub b by b.ss01; + } ss01; + """) + + buf = io.BytesIO() + fb.save(buf) + buf.seek(0) + + font = TTFont(buf) + + gpos_features = font["GPOS"].table.FeatureList.FeatureRecord + assert gpos_features[0].FeatureTag == "size" + assert isinstance(gpos_features[0].Feature.FeatureParams, ot.FeatureParamsSize) + assert gpos_features[0].Feature.LookupCount == 0 + gsub_features = font["GSUB"].table.FeatureList.FeatureRecord + assert gsub_features[0].FeatureTag == "ss01" + assert isinstance( + gsub_features[0].Feature.FeatureParams, ot.FeatureParamsStylisticSet + ) + + options = subset.Options(layout_features=["*"]) + subsetter = subset.Subsetter(options) + subsetter.populate(unicodes=[ord("a")]) + subsetter.subset(font) + + # empty size feature was kept + gpos_features = font["GPOS"].table.FeatureList.FeatureRecord + assert gpos_features[0].FeatureTag == "size" + assert isinstance(gpos_features[0].Feature.FeatureParams, ot.FeatureParamsSize) + assert gpos_features[0].Feature.LookupCount == 0 + # empty ss01 feature was dropped + assert font["GSUB"].table.FeatureList.FeatureCount == 0 + + +@pytest.mark.skipif(etree is not None, reason="lxml is installed") +def test_subset_svg_missing_lxml(ttf_path): + # add dummy SVG table and confirm we raise ImportError upon trying to subset it + font = TTFont(ttf_path) + font["SVG "] = newTable("SVG ") + font["SVG "].docList = [('', 1, 1)] + font.save(ttf_path) + + with pytest.raises(ModuleNotFoundError): + subset.main([str(ttf_path), "--gids=0,1"]) + + +def test_subset_COLR_glyph_closure(tmp_path): + # https://github.com/fonttools/fonttools/issues/2461 + font = TTFont() + ttx = pathlib.Path(__file__).parent / "data" / "BungeeColor-Regular.ttx" + font.importXML(ttx) + + color_layers = font["COLR"].ColorLayers + assert ".notdef" in color_layers + assert "Agrave" in color_layers + assert "grave" in color_layers + + font_path = tmp_path / "BungeeColor-Regular.ttf" + subset_path = font_path.with_suffix(".subset.ttf)") + font.save(font_path) + + subset.main( + [ + str(font_path), + "--glyph-names", + f"--output-file={subset_path}", + "--glyphs=Agrave", + ] + ) + subset_font = TTFont(subset_path) + + glyph_order = subset_font.getGlyphOrder() + + assert glyph_order == [ + ".notdef", # '.notdef' is always included automatically + "A", + "grave", + "Agrave", + ".notdef.alt001", + ".notdef.alt002", + "A.alt002", + "Agrave.alt001", + "Agrave.alt002", + "grave.alt002", + ] + + color_layers = subset_font["COLR"].ColorLayers + assert ".notdef" in color_layers + assert "Agrave" in color_layers + # Agrave 'glyf' uses grave. It should be retained in 'glyf' but NOT in + # COLR when we subset down to Agrave. + assert "grave" not in color_layers + + + if __name__ == "__main__": sys.exit(unittest.main()) diff --git a/Tests/subset/svg_test.py b/Tests/subset/svg_test.py new file mode 100644 index 00000000..d7471d5c --- /dev/null +++ b/Tests/subset/svg_test.py @@ -0,0 +1,556 @@ +from string import ascii_letters +import textwrap + +from fontTools.misc.testTools import getXML +from fontTools import subset +from fontTools.fontBuilder import FontBuilder +from fontTools.pens.ttGlyphPen import TTGlyphPen +from fontTools.ttLib import TTFont, newTable +from fontTools.subset.svg import NAMESPACES, ranges + +import pytest + +etree = pytest.importorskip("lxml.etree") + + +@pytest.fixture +def empty_svg_font(): + glyph_order = [".notdef"] + list(ascii_letters) + + pen = TTGlyphPen(glyphSet=None) + pen.moveTo((0, 0)) + pen.lineTo((0, 500)) + pen.lineTo((500, 500)) + pen.lineTo((500, 0)) + pen.closePath() + glyph = pen.glyph() + glyphs = {g: glyph for g in glyph_order} + + fb = FontBuilder(unitsPerEm=1024, isTTF=True) + fb.setupGlyphOrder(glyph_order) + fb.setupCharacterMap({ord(c): c for c in ascii_letters}) + fb.setupGlyf(glyphs) + fb.setupHorizontalMetrics({g: (500, 0) for g in glyph_order}) + fb.setupHorizontalHeader() + fb.setupOS2() + fb.setupPost() + fb.setupNameTable({"familyName": "TestSVG", "styleName": "Regular"}) + + svg_table = newTable("SVG ") + svg_table.docList = [] + fb.font["SVG "] = svg_table + + return fb.font + + +# 'simple' here means one svg document per glyph. The required 'id' attribute +# containing the 'glyphXXX' indices can be either on a child of the root +# or on the root itself, so we test with both. +# see https://github.com/fonttools/fonttools/issues/2548 + + +def simple_svg_table_glyph_ids_on_children(empty_svg_font): + font = empty_svg_font + svg_docs = font["SVG "].docList + for i in range(1, 11): + svg = new_svg() + etree.SubElement(svg, "path", {"id": f"glyph{i}", "d": f"M{i},{i}"}) + svg_docs.append((etree.tostring(svg).decode(), i, i)) + return font + + +def simple_svg_table_glyph_ids_on_roots(empty_svg_font): + font = empty_svg_font + svg_docs = font["SVG "].docList + for i in range(1, 11): + svg = new_svg(id=f"glyph{i}") + etree.SubElement(svg, "path", {"d": f"M{i},{i}"}) + svg_docs.append((etree.tostring(svg).decode(), i, i)) + return font + + +def new_svg(**attrs): + return etree.Element("svg", {"xmlns": NAMESPACES["svg"], **attrs}) + + +def _lines(s): + return textwrap.dedent(s).splitlines() + + +@pytest.mark.parametrize( + "add_svg_table, gids, retain_gids, expected_xml", + [ + # keep four glyphs in total, don't retain gids, which thus get remapped + ( + simple_svg_table_glyph_ids_on_children, + "2,4-6", + False, + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph1" d="M2,2"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph2" d="M4,4"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph3" d="M5,5"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph4" d="M6,6"/></svg> + + """ + ), + ), + # same as above but with glyph id attribute in the root element itself + # https://github.com/fonttools/fonttools/issues/2548 + ( + simple_svg_table_glyph_ids_on_roots, + "2,4-6", + False, + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph1"><path d="M2,2"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph2"><path d="M4,4"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph3"><path d="M5,5"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph4"><path d="M6,6"/></svg> + + """ + ), + ), + # same four glyphs, but we now retain gids + ( + simple_svg_table_glyph_ids_on_children, + "2,4-6", + True, + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph2" d="M2,2"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph4" d="M4,4"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph5" d="M5,5"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg"><path id="glyph6" d="M6,6"/></svg> + + """ + ), + ), + # retain gids like above but with glyph id attribute in the root element itself + # https://github.com/fonttools/fonttools/issues/2548 + ( + simple_svg_table_glyph_ids_on_roots, + "2,4-6", + True, + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph2"><path d="M2,2"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph4"><path d="M4,4"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph5"><path d="M5,5"/></svg> + + + <svg xmlns="http://www.w3.org/2000/svg" id="glyph6"><path d="M6,6"/></svg> + + """ + ), + ), + ], +) +def test_subset_single_glyph_per_svg( + empty_svg_font, add_svg_table, tmp_path, gids, retain_gids, expected_xml +): + font = add_svg_table(empty_svg_font) + + svg_font_path = tmp_path / "TestSVG.ttf" + font.save(svg_font_path) + + subset_path = svg_font_path.with_suffix(".subset.ttf") + + subset.main( + [ + str(svg_font_path), + f"--output-file={subset_path}", + f"--gids={gids}", + "--retain_gids" if retain_gids else "--no-retain_gids", + ] + ) + subset_font = TTFont(subset_path) + + assert getXML(subset_font["SVG "].toXML, subset_font) == expected_xml + + +# This contains a bunch of cross-references between glyphs, paths, gradients, etc. +# Note the path coordinates are completely made up and not meant to be rendered. +# We only care about the tree structure, not it's visual content. +COMPLEX_SVG = """\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +""" + + +@pytest.mark.parametrize( + "subset_gids, expected_xml", + [ + # we only keep gid=2, with 'glyph2' defined inside 'glyph1': 'glyph2' + # is renamed 'glyph1' to match the new subset indices, and the old 'glyph1' + # is kept (as it contains 'glyph2') but renamed '.glyph1' to avoid clash + ( + "2", + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g id=".glyph1"> + <g id="glyph1"> + <path d="M0,0"/> + </g> + </g> + </svg> + + + """ + ), + ), + # we keep both gid 1 and 2: the glyph elements' ids stay as they are (only the + # range endGlyphID change); a gradient is kept since it's referenced by glyph1 + ( + "1,2", + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <linearGradient id="lg1" x1="50" x2="50" y1="80" y2="80" gradientUnits="userSpaceOnUse"> + <stop stop-color="#A47B62" offset="0"/> + <stop stop-color="#AD8264" offset="1.0"/> + </linearGradient> + </defs> + <g id="glyph1"> + <g id="glyph2"> + <path d="M0,0"/> + </g> + <g> + <path d="M1,1" fill="url(#lg1)"/> + <path d="M2,2"/> + </g> + </g> + </svg> + + + """ + ), + ), + ( + # both gid 3 and 6 refer (via ; the glyph ids and range start/end are renumbered. + "3,6", + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <path id="p1" d="M3,3"/> + </defs> + <g id="glyph1"> + <use xlink:href="#p1"/> + </g> + <g id="glyph2"> + <use xlink:href="#p1" transform="scale(2, 1)"/> + </g> + </svg> + + + """ + ), + ), + ( + # 'glyph4' uses the whole 'glyph1' element (translated); we keep the latter + # renamed to avoid clashes with new gids + "3-4", + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <linearGradient id="lg1" x1="50" x2="50" y1="80" y2="80" gradientUnits="userSpaceOnUse"> + <stop stop-color="#A47B62" offset="0"/> + <stop stop-color="#AD8264" offset="1.0"/> + </linearGradient> + <path id="p1" d="M3,3"/> + </defs> + <g id=".glyph1"> + <g id=".glyph2"> + <path d="M0,0"/> + </g> + <g> + <path d="M1,1" fill="url(#lg1)"/> + <path d="M2,2"/> + </g> + </g> + <g id="glyph1"> + <use xlink:href="#p1"/> + </g> + <use id="glyph2" xlink:href="#.glyph1" x="10"/> + </svg> + + + """ + ), + ), + ( + # 'glyph9' uses a path 'p2' defined inside 'glyph7', the latter is excluded + # from our subset, thus gets renamed '.glyph7'; an unrelated element with + # same id=".glyph7" doesn't clash because it was dropped. + # Similarly 'glyph10' uses path 'p3' defined inside 'glyph8', also excluded + # from subset and prefixed with '.'. But since an id=".glyph8" is already + # used in the doc, we append a .{digit} suffix to disambiguate. + "9,10", + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <g id="group1"> + <g id=".glyph7"> + <path id="p2" d="M4,4"/> + </g> + <g id=".glyph8.1"> + <g id=".glyph8"> + <path id="p3" d="M5,5"/> + </g> + </g> + <g id="glyph1"> + <use xlink:href="#p2"/> + </g> + <g id="glyph2"> + <use xlink:href="#p3"/> + </g> + </g> + </svg> + + + """ + ), + ), + ( + # 'glyph11' uses gradient 'rg4' which inherits from 'rg3', which inherits + # from 'rg2', etc. + "11", + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <radialGradient id="rg2" cx="50" cy="50" r="10" gradientUnits="userSpaceOnUse"> + <stop stop-color="#A47B62" offset="0"/> + <stop stop-color="#AD8264" offset="1.0"/> + </radialGradient> + <radialGradient id="rg3" xlink:href="#rg2" r="20"/> + <radialGradient id="rg4" xlink:href="#rg3" cy="100"/> + </defs> + <g id="glyph1"> + <path d="M7,7" fill="url(#rg4)"/> + </g> + </svg> + + + """ + ), + ), + ( + # 'glyph12' contains a style attribute with inline CSS declarations that + # contains references to a gradient fill and a clipPath: we keep those + "12", + _lines( + """\ + + <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <linearGradient id="lg1" x1="50" x2="50" y1="80" y2="80" gradientUnits="userSpaceOnUse"> + <stop stop-color="#A47B62" offset="0"/> + <stop stop-color="#AD8264" offset="1.0"/> + </linearGradient> + <clipPath id="c1"> + <circle cx="10" cy="10" r="1"/> + </clipPath> + </defs> + <g id="glyph1"> + <path d="M7,7" style="fill:url(#lg1);stroke:red;clip-path:url(#c1)"/> + </g> + </svg> + + + """ + ), + ), + ], +) +def test_subset_svg_with_references( + empty_svg_font, tmp_path, subset_gids, expected_xml +): + font = empty_svg_font + + font["SVG "].docList.append((COMPLEX_SVG, 1, 12)) + svg_font_path = tmp_path / "TestSVG.ttf" + font.save(svg_font_path) + subset_path = svg_font_path.with_suffix(".subset.ttf") + + subset.main( + [ + str(svg_font_path), + f"--output-file={subset_path}", + f"--gids={subset_gids}", + "--pretty-svg", + ] + ) + subset_font = TTFont(subset_path) + + if expected_xml is not None: + assert getXML(subset_font["SVG "].toXML, subset_font) == expected_xml + else: + assert "SVG " not in subset_font + + +def test_subset_svg_empty_table(empty_svg_font, tmp_path): + font = empty_svg_font + + svg = new_svg() + etree.SubElement(svg, "rect", {"id": "glyph1", "x": "1", "y": "2"}) + font["SVG "].docList.append((etree.tostring(svg).decode(), 1, 1)) + + svg_font_path = tmp_path / "TestSVG.ttf" + font.save(svg_font_path) + subset_path = svg_font_path.with_suffix(".subset.ttf") + + # there's no gid=2 in SVG table, drop the empty table + subset.main([str(svg_font_path), f"--output-file={subset_path}", f"--gids=2"]) + + assert "SVG " not in TTFont(subset_path) + + +def test_subset_svg_missing_glyph(empty_svg_font, tmp_path): + font = empty_svg_font + + svg = new_svg() + etree.SubElement(svg, "rect", {"id": "glyph1", "x": "1", "y": "2"}) + font["SVG "].docList.append( + ( + etree.tostring(svg).decode(), + 1, + # the range endGlyphID=2 declares two glyphs however our svg contains + # only one glyph element with id="glyph1", the "glyph2" one is absent. + # Techically this would be invalid according to the OT-SVG spec. + 2, + ) + ) + svg_font_path = tmp_path / "TestSVG.ttf" + font.save(svg_font_path) + subset_path = svg_font_path.with_suffix(".subset.ttf") + + # make sure we don't crash when we don't find the expected "glyph2" element + subset.main([str(svg_font_path), f"--output-file={subset_path}", f"--gids=1"]) + + subset_font = TTFont(subset_path) + assert getXML(subset_font["SVG "].toXML, subset_font) == [ + '', + ' <svg xmlns="http://www.w3.org/2000/svg"><rect id="glyph1" x="1" y="2"/></svg>', + "", + ] + + # ignore the missing gid even if included in the subset; in this test case we + # end up with an empty svg document--which is dropped, along with the empty table + subset.main([str(svg_font_path), f"--output-file={subset_path}", f"--gids=2"]) + + assert "SVG " not in TTFont(subset_path) + + +@pytest.mark.parametrize( + "ints, expected_ranges", + [ + ((), []), + ((0,), [(0, 0)]), + ((0, 1), [(0, 1)]), + ((1, 1, 1, 1), [(1, 1)]), + ((1, 3), [(1, 1), (3, 3)]), + ((4, 2, 1, 3), [(1, 4)]), + ((1, 2, 4, 5, 6, 9, 13, 14, 15), [(1, 2), (4, 6), (9, 9), (13, 15)]), + ], +) +def test_ranges(ints, expected_ranges): + assert list(ranges(ints)) == expected_ranges diff --git a/Tests/svgLib/path/path_test.py b/Tests/svgLib/path/path_test.py index 8ee334a0..caf351d4 100644 --- a/Tests/svgLib/path/path_test.py +++ b/Tests/svgLib/path/path_test.py @@ -1,4 +1,4 @@ -from fontTools.misc.py23 import tobytes +from fontTools.misc.textTools import tobytes from fontTools.pens.recordingPen import RecordingPen from fontTools.svgLib import SVGPath diff --git a/Tests/t1Lib/data/TestT1-ellipsis-hinted.pfa b/Tests/t1Lib/data/TestT1-ellipsis-hinted.pfa new file mode 100644 index 00000000..3fc6696d --- /dev/null +++ b/Tests/t1Lib/data/TestT1-ellipsis-hinted.pfa @@ -0,0 +1,73 @@ +%!FontType1-1.1: TestT1-Regular 1.0 +%%BeginResource: font TestT1-Regular +12 dict dup begin +/FontType 1 def +/FontName /TestT1-Regular def +/FontInfo 14 dict dup begin +/version (1.0) def +/Notice (Test T1 is not a trademark of FontTools.) def +/Copyright (Copyright c 2015 by FontTools. No rights reserved.) def +/FullName (Test T1) def +/FamilyName (Test T1) def +/Weight (Regular) def +/ItalicAngle 0.000000 def +/isFixedPitch false def +/UnderlinePosition -75.000000 def +/UnderlineThickness 50.000000 def +/FSType 0 def +end def +/PaintType 0 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +def +/FontBBox {50.000000 0.000000 668.000000 750.000000} def +end +currentfile eexec a0b00ed5187d9c0f1ecdf51878c3aa5c80164785b2862e5e248314a0dd481e1d +8115d1b5316c01657582d7e6cf3fa3e1aa00733eacc08e989313fc4f69225c12 +e1cce25e5f99b47841c1a01a3778ce0d2cd604a925e1a95952caddc379227509 +e885feae9bdf476bbc2a66a211f868f2cfc17055dcf167e621fd9f41a20f2647 +a3433004f074ba98472481205cebb34224112701c802754418c103b503fdcc51 +ff373f66fea5ab6b7578cc881c6c46de4327adf847412c9df1700b8402f28395 +fc36b2e8826ef268b1f4c0f79d3612e999d7a22412f8fcd4398cba1b4db9b0a1 +a050a7777e3b04617c75f9373f76b7a1daffd6423d0bd68c190f563fa54ff699 +bbe5e5ff80d2329a8f7c5f85d10fe3410cf665fb3e3271d7d92bdbeac0bd6a11 +a3726b6bbc45a143b60b22ae9f5cb25b595bfd3797d0aaca765516fa103b5d01 +e016ca279efa8c90b062ee151238c62dda8d109bea1814ab49ab93034196e785 +a7629fc297ddb0b5ba7bb1da4d9b69c35c4038082747cf0180fb387f1925640a +239c91872b562233065484922f59063bd42241053bf69317d22dbcbfc869996a +11f5f628930da9a2d48d327804add904de6bb0bd84b6584eacdbc2760af6d44f +d4a765c1829b2b650773894ca9d7e303b8dfc43804e4b60a7eb1506139fa96b8 +0f70238f69a4ce6ad2a7e20f344e9f69930fe1cc30688775b2875de4f79039e0 +8c0dc7db7470d9773ad4345d50c1fbdb9089c91b6d170bc3e39b61b3d86e3a78 +1e31d872384c85a6241dc349d0af38785e1f37426ac0ca1b7369bf00c947953a +191be897b89a84d903f590ee852b34433d892f9f60e6b2236e6dee1562d69c9d +e80205d7aa49f9c7d01f8afb16babf9979d3dccf28b23160934d425f503d82d1 +d602bdbea6c0378fa6631f4dd3709dc6db7395663356df1eb3b6ee42d8006e0f +9c1d0402f1bc9cf656bc0f75f51db76781f447139a4babad33af6309d271b472 +7607ca92ff947e561d94a66eda64788fd32c7427341bf5d365a0cb4bbf0a0534 +1a92824f0a80a678ffd6320d9feb538cde66cb65a5d3a7a53d601732fa83efaf +05effa0938b101cfd2dac6a80631c10a7d0a2ea5950a2af3de5afbab29590986 +27fc0526581792c06db8374568e14023384584bba23ac87921af46943a23e0ea +7aa4c0f6a57cbe7c91fac9d612e36f721f518945ce0f70cf3084cf1565480cd9 +f75e6183eefb58d4936a4c8ff76b80b3b9b12d876b3f0c8773a105cf2a24d87e +99feed1ca9114d37698f07763c538a011672b1fc1aa9ed610134f7d7 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%EOF \ No newline at end of file diff --git a/Tests/t1Lib/t1Lib_test.py b/Tests/t1Lib/t1Lib_test.py index 92b3e9e1..3e639a58 100644 --- a/Tests/t1Lib/t1Lib_test.py +++ b/Tests/t1Lib/t1Lib_test.py @@ -3,6 +3,7 @@ import os import sys from fontTools import t1Lib from fontTools.pens.basePen import NullPen +from fontTools.misc.psCharStrings import T1CharString import random @@ -13,6 +14,8 @@ LWFN = os.path.join(DATADIR, 'TestT1-Regular.lwfn') PFA = os.path.join(DATADIR, 'TestT1-Regular.pfa') PFB = os.path.join(DATADIR, 'TestT1-Regular.pfb') WEIRD_ZEROS = os.path.join(DATADIR, 'TestT1-weird-zeros.pfa') +# ellipsis is hinted with 55 131 296 131 537 131 vstem3 0 122 hstem +ELLIPSIS_HINTED = os.path.join(DATADIR, 'TestT1-ellipsis-hinted.pfa') class FindEncryptedChunksTest(unittest.TestCase): @@ -52,24 +55,40 @@ class ReadWriteTest(unittest.TestCase): data = self.write(font, 'PFB') self.assertEqual(font.getData(), data) + def test_read_and_parse_pfa_write_pfb(self): + font = t1Lib.T1Font(PFA) + font.parse() + saved_font = self.write(font, 'PFB', dohex=False, doparse=True) + self.assertTrue(same_dicts(font.font, saved_font)) + def test_read_pfb_write_pfa(self): font = t1Lib.T1Font(PFB) # 'OTHER' == 'PFA' data = self.write(font, 'OTHER', dohex=True) self.assertEqual(font.getData(), data) - @unittest.skipIf(sys.version_info[:2] < (3, 6), "pathlib is only tested on 3.6 and up") + def test_read_and_parse_pfb_write_pfa(self): + font = t1Lib.T1Font(PFB) + font.parse() + # 'OTHER' == 'PFA' + saved_font = self.write(font, 'OTHER', dohex=True, doparse=True) + self.assertTrue(same_dicts(font.font, saved_font)) + def test_read_with_path(self): import pathlib font = t1Lib.T1Font(pathlib.Path(PFB)) @staticmethod - def write(font, outtype, dohex=False): + def write(font, outtype, dohex=False, doparse=False): temp = os.path.join(DATADIR, 'temp.' + outtype.lower()) try: font.saveAs(temp, outtype, dohex=dohex) newfont = t1Lib.T1Font(temp) - data = newfont.getData() + if doparse: + newfont.parse() + data = newfont.font + else: + data = newfont.getData() finally: if os.path.exists(temp): os.remove(temp) @@ -108,6 +127,75 @@ class T1FontTest(unittest.TestCase): self.assertTrue(hasattr(aglyph, 'width')) +class EditTest(unittest.TestCase): + + def test_edit_pfa(self): + font = t1Lib.T1Font(PFA) + ellipsis = font.getGlyphSet()["ellipsis"] + ellipsis.decompile() + program = [] + for v in ellipsis.program: + try: + program.append(int(v)) + except: + program.append(v) + if v == 'hsbw': + hints = [55, 131, 296, 131, 537, 131, 'vstem3', 0, 122, 'hstem'] + program.extend(hints) + ellipsis.program = program + # 'OTHER' == 'PFA' + saved_font = self.write(font, 'OTHER', dohex=True, doparse=True) + hinted_font = t1Lib.T1Font(ELLIPSIS_HINTED) + hinted_font.parse() + self.assertTrue(same_dicts(hinted_font.font, saved_font)) + + @staticmethod + def write(font, outtype, dohex=False, doparse=False): + temp = os.path.join(DATADIR, 'temp.' + outtype.lower()) + try: + font.saveAs(temp, outtype, dohex=dohex) + newfont = t1Lib.T1Font(temp) + if doparse: + newfont.parse() + data = newfont.font + else: + data = newfont.getData() + finally: + if os.path.exists(temp): + os.remove(temp) + return data + + +def same_dicts(dict1, dict2): + if dict1.keys() != dict2.keys(): + return False + for key, value in dict1.items(): + if isinstance(value, dict): + if not same_dicts(value, dict2[key]): + return False + elif isinstance(value, list): + if len(value) != len(dict2[key]): + return False + for elem1, elem2 in zip(value, dict2[key]): + if isinstance(elem1, T1CharString): + elem1.compile() + elem2.compile() + if elem1.bytecode != elem2.bytecode: + return False + else: + if elem1 != elem2: + return False + elif isinstance(value, T1CharString): + value.compile() + dict2[key].compile() + if value.bytecode != dict2[key].bytecode: + return False + else: + if value != dict2[key]: + return False + return True + + if __name__ == '__main__': import sys sys.exit(unittest.main()) diff --git a/Tests/tfmLib/data/cmex10.tfm b/Tests/tfmLib/data/cmex10.tfm new file mode 100644 index 00000000..d5427ad3 Binary files /dev/null and b/Tests/tfmLib/data/cmex10.tfm differ diff --git a/Tests/tfmLib/data/cmr10.tfm b/Tests/tfmLib/data/cmr10.tfm new file mode 100644 index 00000000..6594c9c4 Binary files /dev/null and b/Tests/tfmLib/data/cmr10.tfm differ diff --git a/Tests/tfmLib/data/cmsy10.tfm b/Tests/tfmLib/data/cmsy10.tfm new file mode 100644 index 00000000..3e4488b0 Binary files /dev/null and b/Tests/tfmLib/data/cmsy10.tfm differ diff --git a/Tests/tfmLib/data/dummy-space.tfm b/Tests/tfmLib/data/dummy-space.tfm new file mode 100644 index 00000000..fc0719e1 Binary files /dev/null and b/Tests/tfmLib/data/dummy-space.tfm differ diff --git a/Tests/tfmLib/tfmLib_test.py b/Tests/tfmLib/tfmLib_test.py new file mode 100644 index 00000000..ad74ed7f --- /dev/null +++ b/Tests/tfmLib/tfmLib_test.py @@ -0,0 +1,90 @@ +import glob +import os + +import pytest + +from fontTools import tfmLib + +DATA_DIR = os.path.join(os.path.dirname(__file__), "data") + + +@pytest.mark.parametrize("path", glob.glob(f"{DATA_DIR}/cm*.tfm")) +def test_read(path): + tfm = tfmLib.TFM(path) + assert tfm.designsize == 10.0 + assert tfm.fontdimens + assert len(tfm.fontdimens) >= 7 + assert tfm.extraheader == {} + assert tfm.right_boundary_char is None + assert tfm.left_boundary_char is None + assert len(tfm.chars) == 128 + + +def test_read_boundary_char(): + path = os.path.join(DATA_DIR, "dummy-space.tfm") + tfm = tfmLib.TFM(path) + assert tfm.right_boundary_char == 1 + assert tfm.left_boundary_char == 256 + + +def test_read_fontdimens_vanilla(): + path = os.path.join(DATA_DIR, "cmr10.tfm") + tfm = tfmLib.TFM(path) + assert tfm.fontdimens == { + "SLANT": 0.0, + "SPACE": 0.33333396911621094, + "STRETCH": 0.16666698455810547, + "SHRINK": 0.11111164093017578, + "XHEIGHT": 0.4305553436279297, + "QUAD": 1.0000028610229492, + "EXTRASPACE": 0.11111164093017578, + } + + +def test_read_fontdimens_mathex(): + path = os.path.join(DATA_DIR, "cmex10.tfm") + tfm = tfmLib.TFM(path) + assert tfm.fontdimens == { + "SLANT": 0.0, + "SPACE": 0.0, + "STRETCH": 0.0, + "SHRINK": 0.0, + "XHEIGHT": 0.4305553436279297, + "QUAD": 1.0000028610229492, + "EXTRASPACE": 0.0, + "DEFAULTRULETHICKNESS": 0.03999900817871094, + "BIGOPSPACING1": 0.11111164093017578, + "BIGOPSPACING2": 0.16666698455810547, + "BIGOPSPACING3": 0.19999980926513672, + "BIGOPSPACING4": 0.6000003814697266, + "BIGOPSPACING5": 0.10000038146972656, + } + + +def test_read_fontdimens_mathsy(): + path = os.path.join(DATA_DIR, "cmsy10.tfm") + tfm = tfmLib.TFM(path) + assert tfm.fontdimens == { + "SLANT": 0.25, + "SPACE": 0.0, + "STRETCH": 0.0, + "SHRINK": 0.0, + "XHEIGHT": 0.4305553436279297, + "QUAD": 1.0000028610229492, + "EXTRASPACE": 0.0, + "NUM1": 0.6765079498291016, + "NUM2": 0.39373207092285156, + "NUM3": 0.44373130798339844, + "DENOM1": 0.6859512329101562, + "DENOM2": 0.34484100341796875, + "SUP1": 0.41289234161376953, + "SUP2": 0.36289215087890625, + "SUP3": 0.28888893127441406, + "SUB1": 0.14999961853027344, + "SUB2": 0.24721717834472656, + "SUBDROP": 0.05000019073486328, + "SUPDROP": 0.3861083984375, + "DELIM1": 2.3899993896484375, + "DELIM2": 1.010000228881836, + "AXISHEIGHT": 0.25, + } diff --git a/Tests/ttLib/data/TestVGID-Regular.otf b/Tests/ttLib/data/TestVGID-Regular.otf new file mode 100644 index 00000000..635a3ac8 Binary files /dev/null and b/Tests/ttLib/data/TestVGID-Regular.otf differ diff --git a/Tests/ttLib/data/TestVGID-Regular.ttx b/Tests/ttLib/data/TestVGID-Regular.ttx new file mode 100644 index 00000000..6f4a1c5e --- /dev/null +++ b/Tests/ttLib/data/TestVGID-Regular.ttx @@ -0,0 +1,18418 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Copyright 2021 The Qahiri Project Authors (github.com/alif-type/qahiri). + + + Qahiri + + + Regular + + + 2.00;ALIF;Qahiri-Regular + + + Qahiri Regular + + + Version 2.00 + + + Qahiri-Regular + + + Alif Type + + + Khaled Hosny + + + Qahiri is a Kufic typeface based on the modernized and regularized old manuscript Kufic calligraphy style of the late master of Arabic calligraphy Mohammad Abdul Qadir. + + + https://aliftype.com + + + https://aliftype.com + + + This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://scripts.sil.org/OFL + + + https://scripts.sil.org/OFL + + + صف خلق خود كمثل الشمس إذ بزغت يحظى الضجيع بها نجلاء معطار + + + Dot-less Letter Forms + + + Rounded Dots + + + حروف مهملة (بلا نقاط) + + + نقاط مستديرة + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + vlineto + -101 callsubr + return + + + hlineto + 41 70 rlineto + return + + + -88 callgsubr + endchar + + + rmoveto + -96 callsubr + return + + + -110 rmoveto + return + + + hmoveto + 140 70 return + + + -80 -20 rlineto + return + + + -63 callgsubr + endchar + + + 0 vmoveto + 539 hlineto + -102 callgsubr + 219 -42 callgsubr + -380 vlineto + -93 callgsubr + return + + + -58 callsubr + 210 return + + + hlineto + -93 callgsubr + return + + + 47 79 -17 10 -47 -79 rlineto + return + + + -101 callsubr + -360 return + + + hlineto + -32 -22 3 23 -23 hvcurveto + -11 callgsubr + -85 57 -19 74 -1 vhcurveto + endchar + + + 70 -95 callgsubr + + + -20 vlineto + 100 hmoveto + -59 callsubr + endchar + + + 131 -103 callsubr + return + + + -70 70 70 vlineto + endchar + + + -107 callsubr + -220 vlineto + -107 callgsubr + 170 -107 callsubr + -190 vlineto + -107 callgsubr + 140 -107 callsubr + return + + + -107 callsubr + -180 vlineto + -8 callgsubr + vlineto + -107 callgsubr + 160 -107 callsubr + return + + + vlineto + -80 -20 rlineto + -180 vlineto + -107 callgsubr + 130 -107 callsubr + -150 vlineto + -107 callgsubr + 100 -107 callsubr + return + + + hlineto + -58 -61 65 75 -61 hvcurveto + -43 -70 19 -28 28 -29 15 -13 rlinecurve + return + + + 100 -110 rmoveto + 65 35 30 60 hvcurveto + return + + + -37 callgsubr + -54 callsubr + endchar + + + -20 -102 callsubr + hlineto + -107 callgsubr + return + + + -50 -250 rmoveto + 212 -97 callgsubr + return + + + -70 -69 callgsubr + return + + + hlineto + -103 callgsubr + return + + + 100 hmoveto + 65 35 30 60 return + + + -40 -40 5 35 -20 return + + + vlineto + -35 -20 -40 return + + + -60 45 -30 55 return + + + -48 callsubr + endchar + + + hhcurveto + -96 callgsubr + -11 2 -10 4 -9 hvcurveto + -4 -9 -2 -10 -11 vvcurveto + -50 callsubr + vhcurveto + -22 hlineto + 120 60 rmoveto + -89 callgsubr + -60 -95 callgsubr + + + 0 vmoveto + 536 -55 callgsubr + -390 -97 callsubr + return + + + -71 callsubr + endchar + + + 80 140 rmoveto + 420 vlineto + -101 callsubr + -410 vlineto + -88 5 74 -42 79 hhcurveto + 60 63 24 46 39 hvcurveto + -12 -28 -44 -10 -43 hhcurveto + -64 -61 22 70 hvcurveto + return + + + rmoveto + 142 hlineto + 4 2 0 6 44 -21 9 -14 hvcurveto + -63 56 hlineto + -25 -6 rlineto + -88 -13 vlineto + 38 hmoveto + 14 59 vlineto + 8 6 -6 -8 hvcurveto + -73 hlineto + endchar + + + 17 callgsubr + 210 -70 -67 callgsubr + vlineto + endchar + + + 17 callgsubr + 70 -120 70 120 70 vlineto + endchar + + + 77 -19 111 -93 -56 -45 -40 -50 -98 callgsubr + 10 10 1 3 10 return + + + -366 -52 callsubr + -430 436 vlineto + -103 callgsubr + return + + + 245 18 callgsubr + + + hlineto + 27 70 rlineto + -3 hlineto + -80 -140 rlineto + return + + + 25 callsubr + -189 70 350 -70 -91 -70 hlineto + endchar + + + 49 545 rmoveto + -49 -113 98 -132 49 245 -49 -64 -49 hlineto + endchar + + + 177 148 rmoveto + 19 -19 -27 13 -31 hhcurveto + -78 callsubr + hvcurveto + return + + + -96 callsubr + 63 -10 -104 callsubr + return + + + 40 426 vlineto + -103 callgsubr + -466 hlineto + return + + + -130 -250 rmoveto + 242 -97 callgsubr + return + + + -60 -69 callgsubr + endchar + + + 11 -37 callgsubr + return + + + 245 vmoveto + -245 49 245 vlineto + endchar + + + -85 callgsubr + 11 9 9 11 hvcurveto + return + + + 65 35 30 60 50 -45 40 -55 return + + + 380 hlineto + -101 callsubr + return + + + 210 350 rmoveto + -210 return + + + -7 1 -7 1 -6 return + + + -41 callsubr + 250 -106 callgsubr + + + -33 -220 -73 callgsubr + 96 -40 callsubr + -40 -60 -69 callgsubr + return + + + -85 callsubr + 235 -43 callsubr + + + -33 -220 -73 callgsubr + 96 -22 callgsubr + -40 -57 callsubr + + + 33 callgsubr + -7 -6 0 -7 -74 callsubr + + + -33 callgsubr + endchar + + + -77 callsubr + 0 -40 hhcurveto + -96 callgsubr + -50 callsubr + hvcurveto + -52 -70 52 hlineto + -1 -6 -1 -7 -7 vvcurveto + -76 callsubr + vhcurveto + 180 vmoveto + -89 callgsubr + -110 -95 callgsubr + + + -36 callgsubr + 295 -107 callsubr + -275 vlineto + -18 16 -23 13 -13 vhcurveto + 41 -41 -42 -52 -62 -54 -46 -34 rlinecurve + 180 110 rmoveto + 40 -40 rlineto + -80 hlineto + 40 40 rlineto + endchar + + + -24 callgsubr + 124 return + + + vlineto + 25 -13 16 -35 -32 -22 6 23 -23 vhcurveto + -82 callgsubr + 16 36 10 80 10 hvcurveto + -15 -3 -14 -5 -9 hhcurveto + -90 callgsubr + -83 55 -20 72 -2 vhcurveto + return + + + 243 hlineto + 31 9 14 24 5 hvcurveto + 4 17 1 22 26 vvcurveto + 36 -4 37 -6 25 vhcurveto + 56 -15 -38 33 -50 hhcurveto + -55 -58 callgsubr + -110 -97 callsubr + return + + + 65 109 39 134 12 120 rlinecurve + -92 -40 -4 -101 -17 -84 -35 -81 rlinecurve + -154 266 -60 -57 169 -294 -33 -54 -42 -55 -54 -60 rlinecurve + 156 123 rmoveto + 31 -53 rlineto + -81 hlineto + 18 16 16 18 16 19 rrcurveto + endchar + + + 199 -250 rmoveto + 43 46 8 35 76 hvcurveto + -8 -49 -35 -4 -26 hhcurveto + -83 -91 36 90 67 50 26 40 hvcurveto + return + + + rmoveto + -60 callsubr + return + + + 130 vlineto + 110 -107 callsubr + -129 vlineto + -1 -7 -6 0 -7 -51 callgsubr + + + 68 68 rlineto + 350 -107 callsubr + -330 vlineto + -20 -26 -20 26 rlineto + 320 -107 callsubr + -300 vlineto + 68 -68 rlineto + 32 -32 rmoveto + 40 -40 -17 -13 -46 0 -17 13 rlinecurve + 40 40 rlineto + endchar + + + -79 callsubr + hvcurveto + -12 callgsubr + + + -52 callgsubr + -430 -97 callsubr + 448 90 -106 callgsubr + + + -86 callsubr + -93 hlineto + -90 callgsubr + -85 57 -19 74 -1 vhcurveto + endchar + + + -28 callsubr + endchar + + + 70 -40 130 hlineto + -23 callsubr + + + -72 callgsubr + 82 -7 callgsubr + return + + + -101 callsubr + -50 vlineto + -74 -46 -40 -63 -23 6 -20 6 -14 hvcurveto + -32 hlineto + 109 90 rmoveto + 31 -30 -40 -10 rlineto + 31 -50 rmoveto + -31 30 40 10 -9 -40 rlineto + endchar + + + -436 70 hlineto + -101 callsubr + -410 -12 callsubr + + + -22 callsubr + endchar + + + -91 callsubr + 45 hlineto + 31 101 47 23 54 hvcurveto + return + + + -100 callgsubr + -98 callgsubr + vhcurveto + -93 callsubr + + + -58 callsubr + 270 vlineto + -80 80 39 callgsubr + return + + + -360 hlineto + 41 74 22 88 101 vvcurveto + 37 -3 39 -6 41 vhcurveto + -80 -80 rlineto + 7 -40 4 -42 -43 vvcurveto + -83 -15 -85 -34 -77 vhcurveto + endchar + + + 37 callgsubr + -68 46 -168 9 hvcurveto + -60 -105 rlineto + 172 -80 callsubr + -236 hlineto + endchar + + + 17 hmoveto + -1 callgsubr + + + -86 callsubr + -212 9 callsubr + endchar + + + -20 hmoveto + 339 -106 callsubr + -137 -86 callsubr + -82 hlineto + endchar + + + -20 hmoveto + 359 -106 callsubr + -157 -86 callsubr + -82 hlineto + endchar + + + 19 callsubr + 116 hlineto + endchar + + + -436 -52 callsubr + -470 -92 callsubr + + + 84 245 11 callgsubr + + + -88 callgsubr + 228 230 rmoveto + -59 callsubr + endchar + + + -130 vlineto + -210 -99 callgsubr + 229 vlineto + 1 7 6 0 7 hhcurveto + 55 45 40 50 60 -45 30 -55 return + + + 84 245 rmoveto + -98 -35 98 -49 -245 217 49 -168 49 168 49 -84 49 84 49 vlineto + endchar + + + hlineto + -54 callsubr + return + + + 460 52 callgsubr + -380 vlineto + 15 callsubr + return + + + 147 545 22 callgsubr + + + 350 vmoveto + -350 210 70 -140 70 140 70 -140 70 140 70 vlineto + endchar + + + vlineto + -50 37 -30 40 30 31 16 34 22 vhcurveto + -4 -9 -12 -3 -12 hhcurveto + -24 -23 11 26 hvcurveto + return + + + 70 -41 hlineto + 6 1 7 7 vvcurveto + -100 callgsubr + -50 callsubr + vhcurveto + return + + + 75 560 rmoveto + -88 -42 -12 -114 75 -79 25 50 rcurveline + -57 54 5 82 52 49 rrcurveto + return + + + 82 259 rmoveto + -97 -46 -13 -126 82 -87 28 56 rcurveline + -63 59 6 90 57 54 rrcurveto + return + + + 55 callgsubr + -350 70 189 140 161 vlineto + endchar + + + -160 rmoveto + 59 57 -59 103 rlineto + 59 70 -100 hlineto + -92 160 -59 -57 59 -103 rlineto + return + + + rmoveto + 28 callsubr + -66 callgsubr + hvcurveto + endchar + + + 140 350 rmoveto + -280 -70 280 -70 -350 210 350 vlineto + endchar + + + 0 vmoveto + 97 46 13 126 -82 87 -28 -56 rcurveline + 63 -59 -6 -90 -57 -54 rrcurveto + return + + + vmoveto + 147 147 -98 49 98 49 -38 callgsubr + -98 hlineto + endchar + + + 98 545 13 callsubr + + + 98 245 13 callsubr + + + 62 110 rmoveto + 414 hlineto + 19 callsubr + return + + + 43 callgsubr + 70 140 240 return + + + hlineto + -50 -40 -40 -50 -50 40 -40 50 hvcurveto + return + + + 70 -40 200 hlineto + -101 callsubr + -100 vlineto + -80 80 -42 -71 89 -89 rlineto + return + + + 58 callgsubr + 16 13 13 16 16 -13 13 -16 hvcurveto + return + + + 140 hmoveto + 70 350 -210 -350 70 280 70 hlineto + endchar + + + rmoveto + -196 -49 196 -49 -245 147 245 vlineto + endchar + + + hlineto + -103 callgsubr + -476 hlineto + return + + + -93 callgsubr + -52 -90 rlineto + return + + + 22 110 rmoveto + 414 -80 callsubr + -494 -70 return + + + -20 hmoveto + 690 -101 callgsubr + -436 return + + + -63 -103 callsubr + 339 hlineto + 6 15 0 21 36 return + + + -103 callgsubr + -476 hlineto + -40 -70 rlineto + return + + + -49 -49 49 49 vlineto + endchar + + + -7 -6 0 1 -7 return + + + 40 325 rmoveto + 235 -40 -235 vlineto + return + + + -147 -49 98 -49 -98 return + + + 95 -15 -58 15 -38 hhcurveto + return + + + 70 350 rmoveto + -70 -161 140 return + + + 147 vmoveto + -49 49 49 vlineto + endchar + + + rmoveto + -118 119 118 vlineto + return + + + -22 -18 -18 -22 -22 18 -18 22 return + + + + + + 66 40 hmoveto + 250 450 -250 hlineto + 210 -79 rmoveto + -297 vlineto + -65 148 65 149 rlineto + -170 -290 rmoveto + 283 vlineto + 62 -142 -62 -141 rlineto + 84 192 rmoveto + -60 137 rlineto + 119 hlineto + -59 -137 rlineto + -101 vmoveto + 57 -132 rlineto + -115 hlineto + 58 132 rlineto + endchar + + + 120 hmoveto + 80 90 hlineto + -6 callgsubr + 7 7 0 1 6 hvcurveto + -20 69 -106 callgsubr + + + 416 -29 callgsubr + endchar + + + 265 -49 callgsubr + -273 -35 callgsubr + + + 265 -24 callsubr + -203 -35 callgsubr + + + 66 -37 callsubr + 79 -106 callsubr + -127 hlineto + -21 -12 17 19 21 16 23 37 13 16 -3 -7 18 hvcurveto + 45 -14 -35 25 -35 hhcurveto + -88 -30 -102 -63 38 hvcurveto + -43 -29 -23 -52 -54 vvcurveto + -104 86 -56 113 vhcurveto + endchar + + + 40 -37 callsubr + 134 10 callsubr + -1 44 callgsubr + + + 66 -20 hmoveto + 269 -61 callgsubr + -46 hlineto + endchar + + + 16 -20 hmoveto + 219 -106 callsubr + -127 0 callgsubr + hlineto + endchar + + + -22 -20 hmoveto + 262 10 callsubr + -109 hlineto + endchar + + + 96 -72 callsubr + + + -64 -10 callgsubr + + + 16 80 100 rmoveto + 460 -107 callsubr + -440 vlineto + -66 52 -34 61 42 47 16 34 38 vhcurveto + -8 -24 -27 -5 -24 hhcurveto + -46 -39 17 46 hvcurveto + endchar + + + -144 40 callgsubr + 480 -107 callsubr + -470 vlineto + -30 -13 -20 -27 vhcurveto + endchar + + + -144 -41 callgsubr + -500 vlineto + -25 15 -15 23 vhcurveto + 82 70 -30 hlineto + -7 -3 3 7 hvcurveto + endchar + + + 96 -71 callsubr + 106 363 -100 callsubr + + + 96 -71 callsubr + -3 -218 -100 callsubr + + + 96 -72 callsubr + + + -17 -75 callsubr + + + -17 -33 -250 -73 callgsubr + 126 -40 callsubr + -70 -57 callsubr + + + -22 -49 callgsubr + -283 -80 callgsubr + + + -22 50 callgsubr + -428 -80 callgsubr + + + -22 -91 callsubr + 560 -106 callsubr + -583 -80 callgsubr + + + -22 -44 callsubr + + + -22 24 callgsubr + -583 -80 callgsubr + + + -57 -46 callsubr + + + -57 -46 callsubr + + + -57 -33 -250 -73 callgsubr + 126 -22 callgsubr + -70 -57 callsubr + + + -57 -49 callgsubr + -273 -94 callsubr + + + -57 50 callgsubr + -418 -94 callsubr + + + -57 -91 callsubr + 560 -106 callsubr + -573 -94 callsubr + + + -57 -24 callsubr + -203 -94 callsubr + + + -57 24 callgsubr + -573 -94 callsubr + + + 16 -40 -220 rmoveto + 299 -104 callgsubr + -76 hlineto + -7 -3 3 7 hvcurveto + 80 -80 -120 vlineto + -25 15 -15 23 vhcurveto + 118 -80 callsubr + -196 hlineto + endchar + + + 96 -72 callsubr + + + 290 vmoveto + -70 vlineto + -130 vlineto + -60 35 -30 65 55 45 30 60 50 -45 40 -55 -7 -6 0 1 -7 vhcurveto + 379 vlineto + -80 -20 rlineto + 100 -470 -106 callgsubr + + + 12 236 14 rmoveto + -198 546 -38 -14 199 -546 rlineto + endchar + + + 336 -99 callsubr + 198 -214 -104 callsubr + endchar + + + 336 -99 callsubr + endchar + + + 336 0 vmoveto + 600 70 hlineto + -47 callgsubr + -380 vlineto + -93 callgsubr + endchar + + + 336 0 vmoveto + 600 70 -47 hlineto + -51 140 -68 -46 34 -94 rlineto + -368 -97 callsubr + endchar + + + -144 -20 hmoveto + 79 hlineto + -102 callgsubr + 219 -42 callgsubr + -105 callgsubr + + + -184 -40 callgsubr + 90 -107 callsubr + -70 vlineto + -19 0 -26 -20 vhcurveto + endchar + + + -144 -20 -102 callsubr + hlineto + -47 callgsubr + -105 callgsubr + + + -114 -20 hmoveto + 170 70 -40 hlineto + -86 callgsubr + rlineto + -20 hlineto + endchar + + + -144 -20 -102 callsubr + hlineto + -8 callgsubr + -105 callgsubr + + + -144 -20 -102 callsubr + hlineto + -107 callgsubr + 150 -107 callsubr + -170 -20 vlineto + endchar + + + -144 80 80 rmoveto + 150 -107 callsubr + -210 48 callgsubr + + + -56 168 560 rmoveto + -70 -46 -57 -82 -114 -9 -45 -43 -31 hvcurveto + 43 -31 9 -38 -115 vvcurveto + -89 39 -58 77 vhcurveto + -43 17 -21 41 89 vvcurveto + 93 -3 67 -87 24 vhcurveto + 90 24 0 66 100 vvcurveto + 82 21 37 43 20 vhcurveto + endchar + + + -56 -100 vmoveto + 70 46 57 82 114 9 45 43 31 hvcurveto + -43 31 -9 38 115 vvcurveto + 89 -39 58 -77 vhcurveto + 43 -17 21 -41 -89 vvcurveto + -93 3 -67 87 -24 vhcurveto + -90 -24 0 -66 -100 vvcurveto + -82 -21 -37 -43 -20 vhcurveto + endchar + + + -114 110 560 rmoveto + -110 -660 110 40 -70 580 70 hlineto + endchar + + + -114 -100 vmoveto + 110 660 -110 -40 70 -580 -70 hlineto + endchar + + + -107 59 103 rmoveto + 32 26 26 33 32 -26 26 -32 -33 -26 -26 -32 -33 26 -26 33 hvcurveto + endchar + + + -84 90 hmoveto + 50 70 -40 hlineto + -54 callsubr + 40 70 -50 9 callsubr + endchar + + + -144 40 -83 callgsubr + 180 vmoveto + 22 18 18 22 22 -18 18 -22 -22 -18 -18 -22 -22 18 -18 22 hvcurveto + endchar + + + -144 21 callgsubr + endchar + + + -144 20 callgsubr + endchar + + + -79 callsubr + hvcurveto + -59 callgsubr + + + 476 -27 callgsubr + 230 -50 callgsubr + + + 336 -62 callgsubr + endchar + + + 336 0 vmoveto + 600 -101 callgsubr + -326 -64 callsubr + 372 -80 callsubr + -436 hlineto + endchar + + + 336 -62 callgsubr + 166 185 -70 callsubr + + + -264 17 hmoveto + -96 callsubr + endchar + + + -264 -72 callgsubr + endchar + + + -264 17 hmoveto + -96 callsubr + endchar + + + -264 -72 callgsubr + endchar + + + 80 90 rmoveto + 120 hlineto + -100 callgsubr + -76 callsubr + vhcurveto + 70 vlineto + -85 callgsubr + hvcurveto + 37 10 rmoveto + -34 hlineto + 6 3 7 4 7 hhcurveto + 7 7 -4 -6 3 hvcurveto + endchar + + + -14 -51 callsubr + -350 210 hlineto + -140 70 rmoveto + 70 70 -70 -70 vlineto + 70 140 rmoveto + -70 70 70 -70 hlineto + endchar + + + -14 12 callsubr + + + 82 153 238 rmoveto + 87 -238 66 23 -120 327 rlineto + -66 hlineto + -120 -327 66 -23 87 238 rlineto + endchar + + + 102 163 185 rmoveto + 85 -185 rlineto + 78 hlineto + -163 350 -163 -350 rlineto + 77 hlineto + 86 185 rlineto + endchar + + + -77 36 callgsubr + + + -77 28 callgsubr + + + -14 12 callsubr + + + -77 36 callgsubr + + + -77 28 callgsubr + + + -77 147 245 rmoveto + -147 -245 147 hlineto + -98 49 rmoveto + -39 callgsubr + 49 98 rmoveto + -49 49 49 -49 hlineto + endchar + + + -77 147 545 rmoveto + -147 -245 147 hlineto + -98 49 rmoveto + -39 callgsubr + 49 98 rmoveto + -49 49 49 -49 hlineto + endchar + + + 96 40 -83 callgsubr + 120 -83 callgsubr + 120 -83 callgsubr + endchar + + + 296 140 vmoveto + 520 40 -520 hlineto + endchar + + + -264 endchar + + + 36 140 vmoveto + 260 40 -260 hlineto + endchar + + + -120 64 155 rmoveto + 68 170 -31 83 -50 136 -2 5 -2 6 -2 5 -45 -91 rcurveline + 2 -4 2 -4 2 -5 36 -79 34 -76 -12 -146 rrcurveto + -14 -155 -84 callgsubr + + + -120 40 290 rmoveto + -68 -170 31 -83 50 -136 2 -5 2 -6 2 -5 45 91 rcurveline + -2 4 -2 4 -2 5 -36 79 -34 76 12 146 rrcurveto + 14 155 1 callsubr + + + -144 40 callgsubr + 270 35 vlineto + 41 70 rlineto + -68 0 callgsubr + -70 45 -280 hlineto + -30 -13 -20 -27 vhcurveto + endchar + + + 349 -73 callsubr + 408 245 -104 callsubr + 17 -165 -106 callgsubr + + + 349 -32 callgsubr + + + 349 -32 callgsubr + + + 336 -8 callsubr + 539 -17 callgsubr + + + 389 0 vmoveto + 576 hlineto + 24 13 37 65 -67 callsubr + hvcurveto + -32 callsubr + + + 376 9 callgsubr + 579 -17 callgsubr + + + 349 0 vmoveto + 613 70 -41 hlineto + 1 10 0 10 12 vvcurveto + -67 callsubr + vhcurveto + -52 callgsubr + -390 -97 callsubr + 408 90 -106 callgsubr + + + 336 -8 callsubr + 600 -29 callsubr + + + 389 0 vmoveto + 653 70 -41 hlineto + 1 10 0 10 12 vvcurveto + -67 callsubr + vhcurveto + -32 callsubr + + + 376 9 callgsubr + 640 -29 callsubr + + + -11 -20 hmoveto + 196 -55 callgsubr + -150 hlineto + 120 110 -106 callgsubr + + + -70 callgsubr + 189 vlineto + -20 callgsubr + + + -16 -20 hmoveto + 268 70 -42 137 hlineto + 57 -46 46 -57 -57 -47 -46 -57 -28 15 -26 19 -19 vhcurveto + 62 -64 rlineto + -115 hlineto + 146 83 rmoveto + -40 41 rlineto + -5 5 -4 7 8 vvcurveto + 14 8 12 15 14 12 -12 -14 vhcurveto + -61 vlineto + endchar + + + -94 callgsubr + 130 hlineto + -20 callgsubr + + + 349 -73 callsubr + 405 -214 -104 callsubr + 20 294 -106 callgsubr + + + -14 0 vmoveto + 210 210 -140 70 140 70 -210 -210 140 -70 -140 hlineto + endchar + + + -14 -57 callgsubr + + + -77 -65 callsubr + + + -77 -56 callgsubr + + + -14 -57 callgsubr + + + -77 -65 callsubr + + + -77 -56 callgsubr + + + -77 0 4 callsubr + + + -77 300 4 callsubr + + + -14 -63 callsubr + + + 86 -68 callsubr + + + 86 8 callsubr + 70 -120 70 120 70 vlineto + endchar + + + -14 -6 callsubr + + + -7 -10 callsubr + + + -7 7 callgsubr + + + 86 -68 callsubr + + + 86 27 callgsubr + 70 -120 70 120 70 vlineto + endchar + + + -14 -6 callsubr + + + 86 -68 callsubr + + + -7 -10 callsubr + + + -7 7 callgsubr + + + 56 120 189 rmoveto + 70 91 90 70 -280 -350 70 280 50 hlineto + endchar + + + -77 -54 callgsubr + + + -77 -62 callsubr + + + -184 -118 hmoveto + 312 540 -35 20 -312 -540 rlineto + endchar + + + -74 110 hmoveto + 40 70 rlineto + -110 hlineto + -40 -70 rlineto + endchar + + + -82 callsubr + 300 vlineto + 130 -77 callsubr + -5 -40 hhcurveto + 42 callgsubr + 7 7 0 1 6 hvcurveto + -181 -81 callsubr + 98 230 -106 callgsubr + + + -82 callsubr + 300 vlineto + -100 callgsubr + -76 callsubr + 7 7 0 1 6 vhcurveto + -181 -81 callsubr + 98 230 -106 callgsubr + + + 376 -64 callgsubr + + + 416 -29 callgsubr + 309 340 rmoveto + -96 callsubr + endchar + + + -60 -2 callsubr + 82 hmoveto + -97 -46 -13 -126 82 -87 28 56 rcurveline + -63 59 6 90 57 54 rrcurveto + endchar + + + -60 3 callsubr + 82 hmoveto + 97 46 13 126 -82 87 -28 -56 rcurveline + 63 -59 -6 -90 -57 -54 rrcurveto + endchar + + + -142 -2 callsubr + endchar + + + -142 3 callsubr + endchar + + + 5 callgsubr + 21 callsubr + vhcurveto + 379 -107 callsubr + -560 -99 callgsubr + 39 vlineto + endchar + + + 14 callgsubr + 21 callsubr + vhcurveto + 379 -107 callsubr + endchar + + + 376 -79 callgsubr + endchar + + + 396 90 -103 callsubr + 425 -106 callsubr + -456 -9 callsubr + 479 -106 callsubr + -157 -18 callsubr + + + 416 90 -103 callsubr + 445 -106 callsubr + -476 -9 callsubr + 499 -106 callsubr + -177 -18 callsubr + + + 226 -26 callgsubr + + + 343 -91 callsubr + 331 -106 callsubr + -344 -65 callgsubr + 386 -106 callsubr + -137 -31 callsubr + + + 363 -91 callsubr + 351 -106 callsubr + -364 -65 callgsubr + 406 -106 callsubr + -157 -31 callsubr + + + 47 312 0 callsubr + -29 51 callgsubr + 43 46 8 35 76 hvcurveto + -8 -49 -35 -4 -26 hhcurveto + -83 -91 36 90 67 50 26 40 hvcurveto + 50 hlineto + endchar + + + 226 -26 callgsubr + + + 136 -17 callsubr + + + 156 -16 callsubr + + + 176 -2 callgsubr + + + -73 192 0 callsubr + -79 -70 119 hlineto + endchar + + + 136 -17 callsubr + + + 156 -16 callsubr + + + 176 -2 callgsubr + + + 32 165 50 rmoveto + -15 -9 12 14 15 12 16 26 10 11 -2 -5 13 hvcurveto + 32 -10 -25 18 -25 hhcurveto + -55 -23 -56 -44 13 hvcurveto + -19 hlineto + -29 -50 rlineto + 186 hlineto + 30 50 rlineto + -91 hlineto + endchar + + + -264 72 29 -100 callsubr + + + -264 72 29 -100 callsubr + + + -33 callsubr + + + -79 callsubr + hvcurveto + -35 callsubr + + + -79 callsubr + hvcurveto + -59 callgsubr + + + 100 -102 callsubr + -40 20 hlineto + -12 callgsubr + + + 100 -102 callsubr + -40 20 hlineto + -35 callsubr + + + 100 -102 callsubr + -40 20 hlineto + -59 callgsubr + + + -47 callsubr + + + -85 callsubr + 235 -34 callgsubr + + + -70 callgsubr + 29 vlineto + 235 -77 callsubr + 0 -40 -74 callsubr + + + -70 callgsubr + 29 vlineto + 235 vlineto + -45 callsubr + + + -71 callgsubr + 235 vlineto + -35 -20 -20 0 -40 hhcurveto + -18 callgsubr + + + -71 callgsubr + 235 vlineto + -21 callgsubr + + + -71 callgsubr + 245 vlineto + -28 -16 -24 -7 -40 hhcurveto + -74 -46 -40 -63 -23 6 -20 6 -14 hvcurveto + -32 hlineto + 109 90 rmoveto + 31 -30 -40 -10 rlineto + 31 -50 rmoveto + -31 30 40 10 -9 -40 rlineto + endchar + + + -71 callgsubr + 280 vlineto + -27 callsubr + + + -85 callsubr + 20 40 70 -40 145 -43 callsubr + + + -85 callsubr + 20 40 70 -40 145 -34 callgsubr + + + -94 callgsubr + 205 hlineto + -35 -20 -40 0 -40 -74 callsubr + + + -94 callgsubr + 205 hlineto + -45 callsubr + + + -94 callgsubr + 185 hlineto + -35 -20 -20 0 -40 hhcurveto + -65 -57 -32 -72 -18 4 -16 6 -12 hvcurveto + -28 hlineto + 100 44 rmoveto + 20 2 17 16 21 hhcurveto + -20 -2 -17 -16 -21 hhcurveto + 40 -44 rmoveto + -21 -17 16 20 -2 hvcurveto + 21 17 -16 -20 2 hvcurveto + endchar + + + -94 callgsubr + 185 hlineto + -21 callgsubr + + + -94 callgsubr + 195 hlineto + -28 -16 -24 -7 -40 hhcurveto + -74 -46 -40 -63 -23 6 -20 6 -14 hvcurveto + -32 hlineto + 109 90 rmoveto + 31 -30 -40 -10 rlineto + 31 -50 rmoveto + -31 30 40 10 -9 -40 rlineto + endchar + + + -94 callgsubr + 230 hlineto + -27 callsubr + + + -47 callsubr + + + -33 callsubr + + + 8 callgsubr + 13 264 -63 callgsubr + -13 -194 -106 callgsubr + + + -94 140 vmoveto + 130 40 -130 hlineto + endchar + + + -64 80 80 rmoveto + 120 -107 callsubr + -100 -5 callsubr + 159 vmoveto + 20 vlineto + -80 -21 rlineto + -20 vlineto + endchar + + + -144 -40 -230 47 callgsubr + 370 vlineto + -95 callsubr + vlineto + -30 -13 -20 -27 vhcurveto + 120 469 rmoveto + 20 vlineto + -80 -21 rlineto + -20 vlineto + endchar + + + 376 -79 callgsubr + 180 -124 -104 callsubr + endchar + + + 48 -78 callgsubr + 79 255 -74 callgsubr + + + -4 -46 callgsubr + 16 -5 15 -8 13 vhcurveto + 58 62 -27 128 -98 hhcurveto + -15 -15 -5 -9 -14 hvcurveto + 254 -107 callsubr + -560 -99 callgsubr + 39 vlineto + 142 vmoveto + 79 vlineto + 2 3 0 2 hhcurveto + 37 16 -23 -21 -19 -12 -17 -21 hvcurveto + -7 hlineto + -7 -6 0 1 -7 hvcurveto + endchar + + + -4 0 vmoveto + 80 90 hlineto + -87 callgsubr + -90 80 90 vlineto + 16 -5 15 -8 13 vhcurveto + 58 62 -27 128 -98 hhcurveto + -15 -15 -5 -9 -14 hvcurveto + 254 -107 callsubr + 80 -359 rmoveto + 79 vlineto + 2 3 0 2 hhcurveto + 37 16 -23 -21 -19 -12 -17 -21 hvcurveto + -7 hlineto + -7 -6 0 1 -7 hvcurveto + endchar + + + 376 -64 callgsubr + + + 376 7 callsubr + 579 -104 callgsubr + -21 callsubr + + + 376 116 hmoveto + 463 -104 callgsubr + -366 hlineto + 27 70 rlineto + -3 hlineto + -80 -140 rlineto + 412 hlineto + -15 callsubr + + + 376 116 hmoveto + 524 -101 callgsubr + -66 callsubr + -476 hlineto + -40 -70 rlineto + 116 hlineto + endchar + + + 376 7 callsubr + 640 -101 callgsubr + -21 callsubr + + + 376 116 hmoveto + 524 -101 callgsubr + -366 hlineto + 27 70 rlineto + -3 hlineto + -80 -140 rlineto + 412 hlineto + -15 callsubr + + + 316 -20 hmoveto + 539 -104 callgsubr + -370 -64 callsubr + 416 14 callsubr + endchar + + + 336 16 callsubr + 557 -104 callgsubr + 3 callgsubr + + + 336 -20 hmoveto + 559 -104 callgsubr + -66 callsubr + -496 hlineto + endchar + + + 316 -20 hmoveto + 600 -101 callgsubr + -370 -64 callsubr + 416 14 callsubr + endchar + + + 336 -20 hmoveto + 620 -101 callgsubr + -66 callsubr + -496 hlineto + endchar + + + 336 16 callsubr + 618 -101 callgsubr + 3 callgsubr + + + -184 -20 hmoveto + 100 70 -100 hlineto + endchar + + + 376 -64 callgsubr + + + 376 -79 callgsubr + 419 273 -104 callsubr + endchar + + + -64 -10 callgsubr + + + -74 -58 callsubr + 770 -107 callsubr + -720 -105 callsubr + + + -74 -98 callsubr + 40 70 vlineto + -107 callgsubr + 450 -107 callsubr + -720 -105 callsubr + + + -144 -68 callgsubr + 520 53 callgsubr + + + -184 -40 callgsubr + 380 vlineto + -95 callsubr + vlineto + -19 0 -26 -20 vhcurveto + endchar + + + -184 -40 callgsubr + 270 vlineto + -81 callgsubr + vlineto + -19 0 -26 -20 vhcurveto + endchar + + + -144 -68 callgsubr + 490 -107 callsubr + -440 -105 callgsubr + + + -144 -68 callgsubr + 410 vlineto + -95 callsubr + -105 callgsubr + + + -144 -68 callgsubr + 300 vlineto + -81 callgsubr + -105 callgsubr + + + -144 -83 callsubr + 450 53 callgsubr + + + -144 -83 callsubr + 390 -107 callsubr + -410 -20 vlineto + endchar + + + -144 -83 callsubr + 340 vlineto + -95 callsubr + -105 callgsubr + + + -144 -83 callsubr + 230 vlineto + -81 callgsubr + -105 callgsubr + + + -144 -41 callgsubr + -540 48 callgsubr + + + 96 0 vmoveto + 320 hlineto + -114 197 -38 callsubr + + + -9 0 vmoveto + 215 100 hlineto + 29 -13 31 -30 22 vhcurveto + -92 66 rlineto + 312 -107 callsubr + -234 vlineto + -213 154 -29 -77 242 -175 rlineto + 80 -58 rmoveto + 46 -33 rlineto + 4 -4 5 -5 -8 vvcurveto + -30 -55 80 vlineto + endchar + + + 56 0 vmoveto + 280 hlineto + -108 142 -19 callgsubr + + + 56 0 vmoveto + 280 hlineto + -108 142 -34 callsubr + + + 136 0 vmoveto + 360 hlineto + -46 34 -62 54 -42 52 -30 callgsubr + + + 136 0 vmoveto + 360 hlineto + -46 34 -62 54 -42 52 -42 callsubr + + + 96 0 vmoveto + 360 70 -80 hlineto + -74 127 -38 callsubr + + + -9 0 vmoveto + 255 70 -40 30 hlineto + 29 -13 31 -30 22 vhcurveto + -92 66 rlineto + 312 -107 callsubr + -234 vlineto + -213 154 -29 -77 242 -175 rlineto + 80 -58 rmoveto + 46 -33 rlineto + 4 -4 5 -5 -8 vvcurveto + -30 -55 80 vlineto + endchar + + + 56 0 vmoveto + 320 70 -93 hlineto + -55 72 -19 callgsubr + + + 56 0 vmoveto + 320 70 -93 hlineto + -55 72 -34 callsubr + + + 136 0 vmoveto + 400 70 -124 hlineto + -24 22 -23 24 -19 24 -30 callgsubr + + + 136 0 vmoveto + 400 70 -124 hlineto + -24 22 -23 24 -19 24 -42 callsubr + + + 96 -46 callgsubr + -87 callgsubr + -110 -99 callgsubr + 10 callgsubr + -240 -99 callgsubr + 39 vlineto + endchar + + + 96 120 hmoveto + 80 90 hlineto + -87 callgsubr + -90 80 10 callgsubr + -220 80 90 vlineto + -87 callgsubr + endchar + + + 176 0 vmoveto + 300 23 callgsubr + -102 hlineto + -20 -17 5 15 -11 hvcurveto + 248 -20 rmoveto + -9 callgsubr + + + 16 0 vmoveto + 140 hlineto + -53 callsubr + -96 callgsubr + -40 -5 -30 -35 -20 hvcurveto + 140 70 -106 callgsubr + + + 14 138 -40 rmoveto + -53 callsubr + -52 -43 -36 -46 -5 hvcurveto + -3 -24 -10 -20 -25 -14 rrcurveto + 52 hlineto + -27 17 32 -13 37 hhcurveto + -93 callsubr + + + 176 0 vmoveto + 440 -4 callsubr + -102 hlineto + -20 -17 5 15 -11 hvcurveto + 248 -20 rmoveto + -9 callgsubr + + + 16 0 vmoveto + 280 70 -41 hlineto + 6 1 7 7 vvcurveto + -100 callgsubr + -40 -5 -30 -35 -20 vhcurveto + 140 70 -106 callgsubr + + + 14 138 -40 rmoveto + 43 30 13 27 16 hvcurveto + 51 70 -43 hlineto + 40 -10 -39 30 -48 hhcurveto + -52 -43 -36 -46 -5 hvcurveto + -3 -24 -10 -20 -25 -14 rrcurveto + 52 hlineto + -27 17 32 -13 37 hhcurveto + -93 callsubr + + + -20 hmoveto + 120 23 callgsubr + -22 hlineto + 120 hmoveto + -11 -9 9 11 11 9 9 -56 callsubr + hvcurveto + endchar + + + -20 hmoveto + 260 -4 callsubr + -22 hlineto + 120 hmoveto + -11 -9 9 11 11 9 9 -56 callsubr + hvcurveto + endchar + + + 100 -40 rmoveto + 43 30 13 27 16 hvcurveto + 51 70 -43 hlineto + 40 -10 -39 30 -48 hhcurveto + -48 -39 -30 -40 -11 hvcurveto + -22 -70 31 hlineto + -27 16 30 -13 43 hhcurveto + 70 vmoveto + -11 -9 8 11 hvcurveto + 2 vlineto + 11 9 8 -56 callsubr + vhcurveto + endchar + + + 5 callgsubr + -78 callsubr + vhcurveto + -240 -99 callgsubr + 39 vlineto + endchar + + + 14 callgsubr + -78 callsubr + vhcurveto + endchar + + + -14 70 vmoveto + -70 210 350 -210 -210 140 -70 vlineto + 210 vmoveto + -70 -90 callsubr + + + -14 6 callgsubr + + + -77 12 callgsubr + + + -77 -7 callsubr + + + -14 -51 callsubr + -210 140 -250 70 hlineto + -70 390 rmoveto + -70 -90 callsubr + + + -14 6 callgsubr + + + -77 12 callgsubr + + + -77 -7 callsubr + + + -77 49 vmoveto + -49 147 245 -38 callgsubr + vlineto + 147 vmoveto + 20 callsubr + + + -77 349 vmoveto + -49 147 245 -38 callgsubr + vlineto + 147 vmoveto + 20 callsubr + + + -74 -22 callsubr + 158 365 -104 callsubr + endchar + + + -74 -25 callsubr + + + -74 -25 callsubr + + + -74 -98 callsubr + 40 70 -50 vlineto + -70 70 39 callgsubr + endchar + + + 100 hmoveto + -53 callsubr + -3 callgsubr + + + -154 -44 callgsubr + + + -154 -44 callgsubr + + + -175 -55 callsubr + + + -175 -43 callgsubr + + + -154 350 vmoveto + -460 70 460 vlineto + endchar + + + -154 -44 callgsubr + + + -175 -55 callsubr + + + -175 -43 callgsubr + + + -175 -55 callsubr + + + -175 -43 callgsubr + + + 90 vmoveto + -11 callsubr + -78 callsubr + hvcurveto + 100 -103 callsubr + -84 callsubr + + + 100 180 rmoveto + -65 -35 -30 -60 hvcurveto + -11 callsubr + hvcurveto + -70 vmoveto + -84 callsubr + + + -102 122 560 rmoveto + -154 -178 0 -256 109 -226 45 91 rcurveline + -93 174 -3 230 96 165 rrcurveto + endchar + + + -102 -100 vmoveto + 154 178 0 256 -109 226 -45 -91 rcurveline + 93 -174 3 -230 -96 -165 rrcurveto + endchar + + + 336 -99 callsubr + 210 -214 -74 callgsubr + + + 12 -45 callgsubr + -88 -422 27 callsubr + -229 402 27 callsubr + 31 -480 rmoveto + 38 39 -38 -39 vlineto + -110 402 rmoveto + 38 39 -38 -39 vlineto + endchar + + + 12 -45 callgsubr + -32 -440 rmoveto + -70 70 70 vlineto + -236 390 rmoveto + -90 callsubr + + + -144 40 -83 callgsubr + endchar + + + -144 40 120 -84 callgsubr + + + 200 90 rmoveto + 130 -77 callsubr + -5 -40 hhcurveto + -55 -45 -30 -60 -98 callgsubr + 7 6 0 -1 7 hvcurveto + -249 -99 callgsubr + 190 vlineto + 130 vlineto + -100 20 rmoveto + -84 callsubr + + + 100 180 rmoveto + -55 -45 -30 -60 -50 45 -40 55 7 6 0 -1 7 hvcurveto + -249 -99 callgsubr + 190 vlineto + 130 vlineto + 60 -35 30 -65 vhcurveto + -70 vmoveto + -84 callsubr + + + 32 -24 callgsubr + 86 415 -15 callgsubr + + + 32 -49 callsubr + + + 32 -41 callsubr + 415 -104 callsubr + 17 -175 -106 callgsubr + + + 32 -49 callsubr + + + -8 100 hmoveto + 27 hlineto + -127 -140 46 callgsubr + -40 -70 rlineto + 299 -104 callgsubr + -51 hlineto + 64 70 rlineto + 101 70 -57 hlineto + 1 6 0 7 7 vvcurveto + -100 callgsubr + -76 callsubr + vhcurveto + -93 callsubr + + + 6 531 vmoveto + -78 vlineto + 26 43 37 11 34 hhcurveto + 33 51 -12 -34 -23 -23 -26 -40 -19 hvcurveto + -63 -31 -35 -39 -54 vvcurveto + -28 10 -31 20 -37 vhcurveto + -10 83 28 32 77 41 rrcurveto + 51 28 17 44 40 vvcurveto + 76 -62 60 -76 -31 -32 -10 -19 -29 vhcurveto + 77 -531 -84 callgsubr + + + 6 230 531 rmoveto + 19 -29 -32 10 -31 hhcurveto + -76 -62 -60 -76 -40 17 -44 51 -28 hvcurveto + 77 -41 28 -32 -10 -83 rrcurveto + 20 37 10 31 28 vvcurveto + 54 -35 39 -63 31 vhcurveto + -40 19 -23 26 23 vvcurveto + 34 51 12 33 34 37 -11 -26 43 vhcurveto + -77 -453 -84 callgsubr + + + 6 230 -86 rmoveto + 78 vlineto + -26 -43 -37 -11 -34 hhcurveto + -33 -51 12 34 23 23 26 40 19 hvcurveto + 63 31 35 39 54 vvcurveto + 28 -10 31 -20 37 vhcurveto + 10 -83 -28 -32 -77 -41 rrcurveto + -51 -28 -17 -44 -40 vvcurveto + -76 62 -60 76 31 32 10 19 29 vhcurveto + -77 531 1 callsubr + + + -104 22 callsubr + 120 hmoveto + 235 -40 -235 vlineto + endchar + + + -84 -100 -13 callgsubr + + + -84 -3 callsubr + 65 hmoveto + -88 -42 -12 -114 75 -79 25 50 rcurveline + -57 54 5 82 52 49 rrcurveto + endchar + + + -84 324 -13 callgsubr + + + -149 -3 callsubr + endchar + + + -149 324 -60 callgsubr + endchar + + + -149 -100 -60 callgsubr + endchar + + + -184 22 callsubr + endchar + + + -47 -61 callsubr + -240 -99 callgsubr + 41 callgsubr + + + -47 -61 callsubr + -470 -99 callgsubr + 320 vlineto + 11 9 9 11 7 7 -4 -6 3 vhcurveto + endchar + + + -47 -61 callsubr + -220 80 41 callgsubr + + + 48 -78 callgsubr + endchar + + + 48 -63 -103 callsubr + -20 callsubr + + + 136 0 vmoveto + -4 callgsubr + endchar + + + 136 0 vmoveto + -20 callsubr + + + 19 18 callsubr + -5 30 -9 24 hvcurveto + 69 -50 vlineto + -35 29 -51 20 -66 21 -80 -140 rcurveline + 45 callgsubr + + + 19 18 callsubr + -4 29 -10 25 hvcurveto + 69 -61 vlineto + -37 21 -53 10 -71 4 -60 -105 rcurveline + 45 callgsubr + + + 48 -78 callgsubr + 66 255 -70 callsubr + + + -26 71 vmoveto + -48 9 41 -23 49 hhcurveto + 58 34 24 47 7 hvcurveto + -146 39 rlineto + 144 hlineto + 40 -10 -40 30 -47 hhcurveto + -48 -40 -30 -41 -10 hvcurveto + 141 -38 rlineto + endchar + + + 476 -27 callgsubr + endchar + + + 476 -98 callsubr + 529 vlineto + -48 callgsubr + -26 callsubr + + + 476 -98 callsubr + 590 70 -43 vlineto + 24 callsubr + -436 hlineto + -80 80 -40 -70 40 -40 rlineto + -330 -12 callsubr + + + 476 -98 callsubr + 590 70 -43 vlineto + 24 callsubr + -26 callsubr + + + 406 46 hmoveto + 563 -104 callgsubr + -5 callgsubr + + + 406 46 hmoveto + 624 -101 callgsubr + -5 callgsubr + + + 166 -91 callgsubr + 259 -87 callsubr + -370 -105 callsubr + + + 166 -91 callgsubr + 279 -75 callgsubr + -390 -105 callsubr + + + 166 -91 callgsubr + 299 -89 callsubr + -410 -105 callsubr + + + 166 -28 callgsubr + endchar + + + 166 -91 callgsubr + 239 -76 callgsubr + -410 -105 callsubr + + + 166 -91 callgsubr + 259 -88 callsubr + -430 -105 callsubr + + + 106 -98 callsubr + 159 vlineto + 16 callgsubr + 40 -40 rlineto + -210 -105 callsubr + + + 166 -92 callgsubr + 160 -87 callsubr + -370 -105 callsubr + + + 166 -92 callgsubr + 180 -75 callgsubr + -390 -105 callsubr + + + 166 -92 callgsubr + 200 -89 callsubr + -410 -105 callsubr + + + 166 -92 callgsubr + 120 -77 callgsubr + -390 -88 callgsubr + endchar + + + 166 -92 callgsubr + 140 -76 callgsubr + -410 -105 callsubr + + + 166 -92 callgsubr + 160 -88 callsubr + -430 -105 callsubr + + + 96 -20 hmoveto + 319 hlineto + -102 callgsubr + 259 -87 callsubr + -120 -105 callgsubr + + + 96 -20 hmoveto + 319 hlineto + -102 callgsubr + 279 -75 callgsubr + -140 -105 callgsubr + + + 96 -20 hmoveto + 319 hlineto + -102 callgsubr + 299 -89 callsubr + -160 -105 callgsubr + + + 96 -20 hmoveto + 319 hlineto + -102 callgsubr + 219 -77 callgsubr + -140 -105 callgsubr + + + 96 -20 hmoveto + 319 hlineto + -102 callgsubr + 239 -76 callgsubr + -160 -105 callgsubr + + + 96 -20 hmoveto + 319 hlineto + -102 callgsubr + 259 -88 callsubr + -180 -105 callgsubr + + + 76 -20 hmoveto + 299 hlineto + 16 callgsubr + rlineto + -20 hlineto + endchar + + + 96 -20 hmoveto + 380 70 hlineto + -107 callgsubr + 160 -87 callsubr + -120 -105 callgsubr + + + 96 -20 hmoveto + 380 70 hlineto + -107 callgsubr + 180 -75 callgsubr + -140 -105 callgsubr + + + 96 -20 hmoveto + 380 70 hlineto + -107 callgsubr + 200 -89 callsubr + -160 -105 callgsubr + + + 96 -20 hmoveto + 380 70 hlineto + -107 callgsubr + 120 -77 callgsubr + -140 -105 callgsubr + + + 96 -20 hmoveto + 380 70 hlineto + -107 callgsubr + 140 -76 callgsubr + -160 -105 callgsubr + + + 96 -20 hmoveto + 380 70 hlineto + -107 callgsubr + 160 -88 callsubr + -180 -105 callgsubr + + + 106 -20 hmoveto + 390 70 -40 hlineto + -86 callgsubr + -86 callgsubr + -86 callgsubr + rlineto + -20 hlineto + endchar + + + -144 21 callgsubr + 21 295 -84 callgsubr + + + -144 20 callgsubr + -22 -267 rmoveto + -53 callgsubr + + + -14 34 callgsubr + + + -14 2 callsubr + + + 82 153 112 rmoveto + -87 238 -66 -23 120 -327 rlineto + 66 hlineto + 120 327 -66 23 -87 -238 rlineto + endchar + + + 102 163 165 rmoveto + -86 185 rlineto + -77 hlineto + 163 -350 163 350 rlineto + -78 hlineto + -85 -185 rlineto + endchar + + + -77 6 callsubr + + + -77 5 callsubr + + + -14 2 callsubr + + + -77 6 callsubr + + + -77 5 callsubr + + + -14 0 vmoveto + 210 70 -140 280 -70 hlineto + endchar + + + -77 147 245 rmoveto + -147 -49 98 -196 49 hlineto + endchar + + + -77 147 545 rmoveto + -147 -49 98 -196 49 hlineto + endchar + + + 166 -28 callgsubr + 250 460 rmoveto + -1 callgsubr + + + -14 210 280 rmoveto + 70 -210 -350 210 210 -140 70 vlineto + -210 vmoveto + 70 70 -70 -70 vlineto + endchar + + + -14 -63 callsubr + + + -14 34 callgsubr + + + -77 -54 callgsubr + + + -77 -62 callsubr + + + -14 25 callsubr + -299 70 460 -70 -91 -70 hlineto + endchar + + + -14 -51 callsubr + -70 140 -390 70 hlineto + endchar + + + -14 -63 callsubr + + + -77 -54 callgsubr + + + -77 -62 callsubr + + + -77 147 196 13 callgsubr + + + -77 147 496 13 callgsubr + + + 12 -45 callgsubr + endchar + + + -264 endchar + + + -224 endchar + + + -184 endchar + + + -64 80 80 rmoveto + 80 80 19 -80 81 -107 callsubr + -61 -20 -19 20 -80 -5 callsubr + endchar + + + 486 -16 callgsubr + endchar + + + 486 0 vmoveto + 750 -101 callgsubr + -436 -52 callsubr + -470 -40 vlineto + 120 hmoveto + -59 callsubr + endchar + + + 406 -20 hmoveto + 629 -104 callgsubr + -14 callsubr + + + 406 -20 hmoveto + 629 -104 callgsubr + -436 270 hlineto + -95 callsubr + -92 callsubr + + + 406 -20 hmoveto + 629 -104 callgsubr + -436 160 hlineto + -81 callgsubr + -92 callsubr + + + 406 -20 hmoveto + 690 -101 callgsubr + -14 callsubr + + + 406 17 callsubr + 270 hlineto + -95 callsubr + -92 callsubr + + + 406 17 callsubr + 160 hlineto + -81 callgsubr + -92 callsubr + + + -264 0 vmoveto + 142 hlineto + 4 2 0 6 44 -21 9 -14 hvcurveto + -63 56 hlineto + -25 -6 rlineto + -88 -13 vlineto + 38 hmoveto + 14 59 vlineto + 8 6 -6 -8 hvcurveto + -73 hlineto + endchar + + + 376 -79 callgsubr + 192 -124 -74 callgsubr + + + 336 -99 callsubr + 190 110 -36 callsubr + endchar + + + -31 callgsubr + + + -31 callgsubr + + + 336 -62 callgsubr + 240 -50 callgsubr + + + 336 -99 callsubr + 167 110 -74 callgsubr + + + -14 210 hmoveto + 350 57 callgsubr + -70 140 -70 -140 -70 vlineto + endchar + + + 86 -69 callsubr + + + 86 8 callsubr + 210 -70 -67 callgsubr + vlineto + endchar + + + -7 -13 callsubr + + + -7 4 callgsubr + + + 86 -69 callsubr + + + 86 27 callgsubr + 210 -70 -67 callgsubr + vlineto + endchar + + + 86 -69 callsubr + + + -7 -13 callsubr + + + -7 4 callgsubr + + + -77 147 hmoveto + 245 23 callsubr + -49 98 -49 -98 -49 vlineto + endchar + + + -77 147 300 rmoveto + 245 23 callsubr + -49 98 -49 -98 -49 vlineto + endchar + + + -264 -19 callsubr + + + -264 68 58 rmoveto + 11 callsubr + -39 70 rmoveto + 11 callsubr + 82 hmoveto + -16 -13 -13 -16 -16 13 -13 16 16 13 13 16 16 -13 13 -16 hvcurveto + endchar + + + -264 -19 callsubr + + + -264 -28 callsubr + -43 70 rmoveto + -53 callgsubr + + + 336 -99 callsubr + 154 110 -70 callsubr + + + -14 210 hmoveto + 70 -140 70 140 210 57 callgsubr + -210 vlineto + endchar + + + -14 -1 callsubr + + + -14 350 vmoveto + -350 70 280 140 70 vlineto + endchar + + + -77 26 callgsubr + + + -77 25 callgsubr + + + -14 55 callgsubr + -460 70 299 140 161 vlineto + endchar + + + -14 350 vmoveto + -460 70 390 140 70 vlineto + endchar + + + -14 -1 callsubr + + + -77 26 callgsubr + + + -77 25 callgsubr + + + -77 147 hmoveto + 32 callgsubr + + + -77 147 300 rmoveto + 32 callgsubr + + + -264 17 hmoveto + -60 callsubr + endchar + + + -264 -30 callsubr + + + -264 17 hmoveto + -60 callsubr + endchar + + + -264 -30 callsubr + + + -264 19 callgsubr + + + -264 -14 callgsubr + + + -264 19 callgsubr + + + -264 -14 callgsubr + + + 100 hmoveto + 40 40 -5 -35 20 hvcurveto + 240 2 callgsubr + vhcurveto + endchar + + + 200 180 rmoveto + -80 -90 hlineto + 54 callgsubr + 90 -80 -90 vlineto + -98 callgsubr + 40 40 -5 -35 20 vhcurveto + endchar + + + -134 -40 -90 rmoveto + 170 40 -170 hlineto + endchar + + + -50 38 callgsubr + 107 230 rlineto + endchar + + + 349 -73 callsubr + 347 245 1 callgsubr + -14 -165 -106 callgsubr + + + 87 38 callgsubr + 69 147 68 -147 107 230 rlineto + -77 hlineto + -30 -65 -30 65 rlineto + endchar + + + 6 -50 -103 callsubr + -39 callsubr + 128 90 -106 callgsubr + + + 6 130 hmoveto + -25 callgsubr + + + 69 0 vmoveto + 243 hlineto + 31 9 14 24 5 hvcurveto + 4 17 1 22 26 vvcurveto + 36 -4 37 -6 25 vhcurveto + 56 -15 -38 33 -50 hhcurveto + -55 -58 callgsubr + -110 -97 callsubr + 128 90 -106 callgsubr + + + 56 180 110 rmoveto + -25 callgsubr + + + 16 130 hmoveto + 31 hlineto + 1 -6 0 -6 -6 vvcurveto + -7 0 -8 -2 -7 vhcurveto + -110 hlineto + 15 callsubr + 243 hlineto + 31 9 14 24 5 hvcurveto + 4 17 1 22 26 3 0 2 2 vvcurveto + 37 70 -43 hlineto + -1 7 -2 7 -1 7 rrcurveto + 56 -15 -38 33 -50 hhcurveto + -96 callgsubr + -98 callgsubr + hvcurveto + -93 callsubr + + + 6 130 hmoveto + 20 -40 -100 hlineto + 31 callgsubr + 70 40 70 -40 20 vlineto + -23 callsubr + + + 6 -50 -103 callsubr + -39 callsubr + 140 279 -63 callgsubr + -12 -189 -106 callgsubr + + + -10 137 230 rmoveto + -30 -65 -30 65 rlineto + -77 hlineto + 53 -115 -53 -115 rlineto + 77 hlineto + 30 65 30 -65 rlineto + 77 hlineto + -54 115 54 115 rlineto + endchar + + + -82 callsubr + 410 2 callgsubr + 7 6 0 -1 7 vhcurveto + -179 -81 callsubr + endchar + + + -82 callsubr + 390 -80 -90 vlineto + -11 -9 -9 -11 -11 -9 9 11 vhcurveto + 90 -80 -90 vlineto + -98 callgsubr + 7 6 0 -1 7 vhcurveto + -179 -81 callsubr + endchar + + + -17 -75 callsubr + + + -17 -75 callsubr + + + -17 -48 callsubr + 51 357 -100 callsubr + + + -22 -44 callsubr + + + -22 -33 callgsubr + -61 337 -100 callsubr + + + 47 22 160 rmoveto + 153 hlineto + -175 -160 rlineto + 257 hlineto + -52 90 rlineto + -15 -11 -17 -5 -20 hhcurveto + -59 hlineto + 173 160 rlineto + -227 hlineto + endchar + + + 486 -16 callgsubr + 230 -50 callgsubr + + + 48 -78 callgsubr + 140 255 -104 callsubr + endchar + + + -14 -57 callgsubr + + + -154 210 vmoveto + -90 callsubr + + + -175 26 callsubr + + + -175 56 callgsubr + + + -154 210 vmoveto + -90 callsubr + + + -175 26 callsubr + + + -175 56 callgsubr + + + -77 -65 callsubr + + + -77 -56 callgsubr + + + + + + + + -22 -18 18 22 hvcurveto + return + + + rmoveto + -89 callgsubr + endchar + + + -20 vlineto + endchar + + + hlineto + -48 callgsubr + return + + + 22 18 -18 -22 hvcurveto + return + + + 6 15 0 11 hvcurveto + return + + + 70 -43 hlineto + 95 -15 -58 15 -38 hhcurveto + return + + + 50 -45 40 -55 -96 callgsubr + return + + + vlineto + 80 20 rlineto + return + + + -50 45 -40 55 return + + + hlineto + 23 15 15 25 hvcurveto + return + + + -55 -45 -40 -50 return + + + vmoveto + -89 callgsubr + endchar + + + -20 hmoveto + 260 70 -40 return + + + -22 -16 7 13 -10 hvcurveto + return + + + -130 -250 rmoveto + 242 -97 callgsubr + 210 280 70 vlineto + -107 callgsubr + return + + + -130 -250 rmoveto + 242 -97 callgsubr + 210 219 vlineto + -102 callgsubr + return + + + -9 -5 5 4 -4 hvcurveto + -64 64 rlineto + -50 50 -44 -149 -49 vvcurveto + return + + + -85 callgsubr + 11 9 9 11 -37 callgsubr + hvcurveto + return + + + -100 -69 callgsubr + return + + + 11 9 9 11 11 9 -9 -11 vhcurveto + return + + + -70 70 -40 -70 return + + + -11 -9 9 11 return + + + rmoveto + -66 callgsubr + -22 -18 -18 -22 -22 18 -18 22 hvcurveto + endchar + + + hmoveto + -66 callgsubr + -22 -18 -18 -22 -22 18 -18 22 hvcurveto + return + + + -31 31 -17 17 9 47 14 -14 rlinecurve + 52 -52 rlineto + -10 10 9 -5 12 hhcurveto + return + + + -80 -20 rlineto + -250 return + + + -23 callgsubr + endchar + + + 90 -110 rmoveto + 405 hlineto + 41 70 rlineto + -436 hlineto + -85 callgsubr + 11 9 9 11 hvcurveto + 459 hlineto + 41 70 rlineto + -137 hlineto + -58 -61 65 75 -61 hvcurveto + -43 -70 19 -28 28 -29 15 -13 rlinecurve + -212 hlineto + -50 -40 -40 -50 -50 40 -40 50 hvcurveto + return + + + -63 -110 rmoveto + -4 callgsubr + return + + + -42 callgsubr + vlineto + -47 callgsubr + 15 callgsubr + return + + + vlineto + -80 -20 rlineto + -160 vlineto + -107 callgsubr + 140 vlineto + -80 -20 rlineto + -160 vlineto + -107 callgsubr + 140 vlineto + -80 -20 rlineto + return + + + vlineto + -80 -20 rlineto + -200 vlineto + -107 callgsubr + 150 vlineto + -80 -20 rlineto + -170 15 callgsubr + return + + + 1 callgsubr + endchar + + + rmoveto + 202 -97 callgsubr + return + + + 29 -7 callgsubr + return + + + -70 callgsubr + 9 vlineto + return + + + -20 hmoveto + 199 hlineto + -102 callgsubr + return + + + vlineto + -20 -17 5 15 -11 hvcurveto + return + + + -20 hmoveto + 62 -97 callgsubr + return + + + -140 -50 140 return + + + 22 18 18 22 22 -18 18 -22 return + + + hlineto + -32 -22 3 23 -23 hvcurveto + -82 callgsubr + return + + + 116 hmoveto + 463 -104 callgsubr + -366 380 hlineto + -80 -20 rlineto + -430 436 vlineto + -103 callgsubr + -476 hlineto + -40 -70 rlineto + 116 hlineto + endchar + + + rmoveto + -8 -5 7 8 9 7 9 15 5 7 -1 -3 7 hvcurveto + 18 -6 -14 11 -14 hhcurveto + -32 -14 -33 -25 8 hvcurveto + -11 hlineto + -17 -29 rlineto + 108 hlineto + 17 29 rlineto + -53 hlineto + return + + + 0 vmoveto + 539 -104 callgsubr + -326 hlineto + 27 70 rlineto + -3 hlineto + -80 -140 rlineto + 372 hlineto + -103 callgsubr + -436 hlineto + return + + + hlineto + 41 70 rlineto + -139 hlineto + -32 -53 47 31 29 65 38 20 12 hvcurveto + -1 3 rlineto + -53 -26 -93 -47 -48 vvcurveto + -13 6 -13 16 -13 vhcurveto + return + + + vmoveto + 30 callgsubr + return + + + 130 vlineto + 340 vlineto + -80 -20 rlineto + -359 vlineto + -1 -7 -6 0 -7 -51 callgsubr + + + -45 -40 -50 -98 callgsubr + 10 10 1 3 10 hvcurveto + -52 callgsubr + return + + + 350 vmoveto + -350 210 350 vlineto + -140 -280 rmoveto + 210 70 -210 -70 vlineto + endchar + + + 545 18 callgsubr + + + hlineto + 24 13 37 65 77 -19 111 -93 -56 -58 callgsubr + return + + + 49 245 rmoveto + -49 -113 98 -132 49 245 -49 -64 -49 hlineto + endchar + + + 29 callgsubr + endchar + + + 2 -7 0 -8 -7 vvcurveto + -7 0 -8 -2 -7 vhcurveto + return + + + hhcurveto + -3 callgsubr + + + 185 rmoveto + 47 79 -17 10 -47 -79 rlineto + endchar + + + 131 -110 rmoveto + 260 hlineto + 41 70 rlineto + return + + + 6 15 0 21 139 -70 20 -44 hvcurveto + return + + + -107 callgsubr + 120 vlineto + -80 -20 rlineto + -140 return + + + 80 39 rmoveto + 51 vlineto + -87 callgsubr + -110 -99 callgsubr + 90 vlineto + return + + + 14 vmoveto + 37 -14 199 546 -38 14 rlineto + return + + + 350 vmoveto + -350 70 350 vlineto + endchar + + + 545 vmoveto + -245 49 245 vlineto + endchar + + + vlineto + -80 -20 rlineto + -140 return + + + 80 80 rmoveto + 480 vlineto + -80 -20 rlineto + return + + + -20 hmoveto + 57 43 30 40 hvcurveto + return + + + 49 49 -49 -49 vlineto + return + + + -147 -147 98 -49 return + + + 11 9 -9 -11 -11 -9 -9 -11 return + + + 41 41 rcurveline + 13 13 16 18 23 vvcurveto + 325 vlineto + -80 -20 rlineto + -305 vlineto + -16 -8 -18 -12 -21 vhcurveto + -12 21 -8 18 16 vvcurveto + return + + + -65 callgsubr + 308 -61 callgsubr + -49 hlineto + -90 callgsubr + -85 57 -19 74 -1 vhcurveto + endchar + + + vlineto + 36 vlineto + -80 -20 rlineto + -51 vlineto + -7 -6 0 -7 hhcurveto + -96 callgsubr + -7 1 -7 1 -6 hvcurveto + -52 -70 52 hlineto + -1 -6 -1 -7 -7 vvcurveto + -60 45 -30 55 vhcurveto + 180 vmoveto + -89 callgsubr + -110 -95 callgsubr + + + 131 -110 rmoveto + 45 hlineto + 31 101 47 23 54 hvcurveto + -213 -23 callgsubr + return + + + 0 vmoveto + 536 -55 callgsubr + -390 hlineto + -93 callgsubr + 408 90 -106 callgsubr + + + 8 callgsubr + -38 235 -15 callgsubr + + + -36 callgsubr + 325 vlineto + -80 -20 rlineto + -305 vlineto + -18 16 -23 13 -13 vhcurveto + 41 -41 -42 -52 -62 -54 -46 -34 rlinecurve + 180 110 rmoveto + 40 -40 rlineto + -80 hlineto + 40 40 rlineto + endchar + + + 90 -110 rmoveto + 445 hlineto + 41 70 rlineto + -476 hlineto + -85 callgsubr + 11 9 9 11 hvcurveto + 499 -61 callgsubr + -286 hlineto + -50 -40 -40 -50 -50 40 -40 50 hvcurveto + return + + + -91 callgsubr + 219 -77 callgsubr + -390 -88 callgsubr + return + + + -130 -250 rmoveto + 242 -97 callgsubr + 210 529 vlineto + -48 callgsubr + -436 hlineto + -80 80 -40 -70 40 -40 rlineto + -330 -88 callgsubr + 228 230 rmoveto + 40 426 vlineto + -103 callgsubr + -466 hlineto + return + + + 199 -250 rmoveto + 43 46 8 35 76 hvcurveto + -8 -49 -35 -4 -26 hhcurveto + -83 -91 36 90 67 50 26 40 hvcurveto + 239 hlineto + 41 70 rlineto + -137 hlineto + -58 -61 65 75 -61 hvcurveto + -43 -70 19 -28 28 -29 15 -13 rlinecurve + -2 44 callgsubr + + + 7 7 1 1 6 hvcurveto + -42 -100 vlineto + 31 callgsubr + 160 vlineto + -100 callgsubr + -98 callgsubr + vhcurveto + 70 -95 callgsubr + + + -64 -250 rmoveto + 299 -104 callgsubr + -51 hlineto + 88 97 rlineto + 14 15 7 21 27 vvcurveto + -100 callgsubr + -60 45 -30 55 11 10 1 1 9 vhcurveto + -130 -142 46 callgsubr + return + + + hlineto + -32 -12 3 23 -23 hvcurveto + -82 callgsubr + 16 36 10 80 10 hvcurveto + -15 -3 -14 -5 -9 hhcurveto + -90 callgsubr + -85 57 -19 74 -1 vhcurveto + return + + + vlineto + 25 -13 16 -35 -32 -22 6 23 -23 vhcurveto + -11 callgsubr + -83 55 -20 72 -2 vhcurveto + return + + + 33 callgsubr + -18 callgsubr + + + -100 callgsubr + -98 callgsubr + 7 7 1 1 6 vhcurveto + -42 -140 vlineto + 120 110 -106 callgsubr + + + 68 68 rlineto + 350 vlineto + -80 -20 rlineto + -330 vlineto + -20 -26 -20 26 rlineto + 350 vlineto + -80 -20 rlineto + -330 vlineto + 68 -68 rlineto + 32 -32 rmoveto + 40 -40 -17 -13 -46 0 -17 13 rlinecurve + 40 40 rlineto + endchar + + + -65 -57 -32 -72 -18 4 -16 6 -12 hvcurveto + -28 hlineto + 100 44 rmoveto + 20 2 17 16 21 hhcurveto + -20 -2 -17 -16 -21 hhcurveto + 40 -44 rmoveto + -21 -17 16 20 -2 hvcurveto + 21 17 -16 -20 2 hvcurveto + endchar + + + hlineto + -102 callgsubr + 189 vlineto + -100 callgsubr + -98 callgsubr + vhcurveto + 70 -95 callgsubr + + + 0 vmoveto + 689 -104 callgsubr + -436 380 hlineto + -80 -20 rlineto + -470 -40 vlineto + 120 hmoveto + 40 426 vlineto + -103 callgsubr + -466 hlineto + return + + + rmoveto + 47 79 -17 10 -47 -79 rlineto + 63 -10 rmoveto + 47 79 -17 10 -47 -79 rlineto + 9 -175 -106 callgsubr + + + -72 callgsubr + 80 vmoveto + -53 callgsubr + + + -60 callgsubr + 65 hmoveto + 30 callgsubr + endchar + + + 130 vlineto + -35 -20 -40 -5 -40 -51 callgsubr + + + -82 callgsubr + 67 70 -31 hlineto + -90 callgsubr + return + + + -41 callgsubr + -460 vlineto + -50 37 -30 40 30 31 16 34 22 vhcurveto + -4 -9 -12 -3 -12 hhcurveto + -24 -23 11 26 hvcurveto + endchar + + + -89 callgsubr + endchar + + + -107 callgsubr + 160 vlineto + -80 -20 rlineto + -180 return + + + hmoveto + 29 callgsubr + return + + + 130 vlineto + -35 -20 -40 -5 -40 hhcurveto + -96 callgsubr + -60 45 -30 55 return + + + -436 70 hlineto + -80 -20 rlineto + -160 -20 -70 66 vlineto + 34 110 rmoveto + 426 hlineto + -103 callgsubr + -466 40 hlineto + endchar + + + 37 callgsubr + -69 43 -147 47 hvcurveto + -80 -140 rlineto + 172 hlineto + -103 callgsubr + -236 hlineto + return + + + 42 callgsubr + hvcurveto + 70 -95 callgsubr + + + -20 hmoveto + 379 hlineto + 41 70 rlineto + -177 hlineto + -58 -61 65 75 -61 hvcurveto + -43 -70 19 -28 28 -29 15 -13 rlinecurve + -82 hlineto + endchar + + + 47 79 -17 10 -47 -79 rlineto + 63 -10 rmoveto + 47 79 -17 10 -47 -79 rlineto + 63 -10 rmoveto + 47 79 -17 10 -47 -79 rlineto + endchar + + + hlineto + -21 -12 17 19 21 16 23 37 13 16 -3 -7 18 hvcurveto + 45 -14 -35 25 -35 hhcurveto + -77 -33 -78 -62 19 hvcurveto + -25 return + + + rmoveto + 47 79 -17 10 -47 -79 rlineto + 63 -10 rmoveto + 47 79 -17 10 -47 -79 rlineto + 63 -10 rmoveto + 47 79 -17 10 -47 -79 rlineto + return + + + vlineto + -80 -20 rlineto + -90 vlineto + 54 callgsubr + 110 vlineto + -80 -20 rlineto + -90 vlineto + -98 callgsubr + return + + + -360 hlineto + 62 111 14 132 -22 137 -80 -80 rcurveline + 25 -125 -11 -134 -52 -111 rrcurveto + endchar + + + 84 545 11 callgsubr + + + -46 callgsubr + 50 -45 40 -55 return + + + 210 350 rmoveto + -210 -210 140 -140 70 hlineto + -70 280 rmoveto + -70 -70 70 70 vlineto + endchar + + + 84 545 rmoveto + -98 -35 98 -49 -245 217 49 -168 49 168 49 -84 49 84 49 vlineto + endchar + + + 100 hmoveto + 65 35 30 60 hvcurveto + -6 callgsubr + hvcurveto + return + + + 500 52 callgsubr + -420 vlineto + -93 callgsubr + -52 -90 rlineto + return + + + 90 vlineto + 50 -45 40 -55 -22 -21 -7 -11 -17 vhcurveto + 11 -17 -21 7 -22 hhcurveto + -40 -40 5 35 -20 hvcurveto + return + + + rmoveto + -98 -35 98 -49 -245 217 49 -168 49 168 147 -49 -98 -35 98 vlineto + endchar + + + 147 245 22 callgsubr + + + rmoveto + 49 -147 -245 147 147 -98 49 vlineto + -147 vmoveto + -39 callgsubr + endchar + + + 0 vmoveto + 80 90 hlineto + -87 callgsubr + -90 80 90 vlineto + 50 -45 40 -55 return + + + vlineto + -107 callgsubr + 120 vlineto + -80 -20 rlineto + return + + + -102 callgsubr + 166 vlineto + -80 -20 rlineto + -87 vlineto + -86 callgsubr + -86 callgsubr + return + + + 43 callgsubr + 310 70 -240 70 240 return + + + vmoveto + -245 147 245 vlineto + -98 -196 rmoveto + 147 49 -147 -49 vlineto + endchar + + + 29 hmoveto + 47 79 -17 10 -47 -79 rlineto + 5 47 rmoveto + 47 79 -17 10 -47 -79 rlineto + endchar + + + 61 185 rmoveto + -65 -35 -21 -69 62 -81 43 58 rcurveline + -24 21 -25 64 30 42 rrcurveto + return + + + 19 -115 rmoveto + 65 35 21 69 -62 81 -43 -58 rcurveline + 24 -21 25 -64 -30 -42 rrcurveto + return + + + rmoveto + -147 -147 98 -98 49 hlineto + -49 196 rmoveto + -49 -49 49 49 vlineto + endchar + + + hlineto + 65 35 30 60 -100 callgsubr + -7 1 -7 1 -6 hvcurveto + return + + + 131 -110 rmoveto + 46 hlineto + 125 258 36 18 163 hvcurveto + 9 16 rlineto + return + + + 98 545 35 callgsubr + + + 98 245 35 callgsubr + + + 49 callgsubr + -460 70 250 240 return + + + 98 300 rmoveto + 49 245 -147 -245 49 196 49 hlineto + endchar + + + 16 13 13 16 16 -13 13 -16 58 callgsubr + hvcurveto + return + + + 88 42 12 114 -75 79 -25 -50 rcurveline + 57 -54 -5 -82 -52 -49 rrcurveto + return + + + -93 callgsubr + -52 -90 rlineto + 242 -97 callgsubr + return + + + 49 -98 49 98 147 -147 -49 98 -49 -98 -147 vlineto + endchar + + + 35 vlineto + -80 -20 rlineto + -50 vlineto + return + + + 210 350 rmoveto + -210 -70 140 -280 70 hlineto + endchar + + + rmoveto + -64 -49 64 -49 -245 49 132 98 113 vlineto + endchar + + + 98 hmoveto + 49 245 -147 -245 49 196 49 hlineto + endchar + + + 339 hlineto + 6 15 0 21 139 return + + + 117 230 rmoveto + -30 -65 -30 65 rlineto + -77 hlineto + 107 -230 return + + + -40 -70 40 -40 rlineto + -210 -88 callgsubr + return + + + -40 20 47 callgsubr + return + + + 90 vlineto + 11 9 9 11 7 7 -4 -6 3 vhcurveto + endchar + + + -96 callgsubr + -60 45 -30 55 return + + + 49 callgsubr + -350 return + + + 51 callgsubr + hvcurveto + endchar + + + 172 hlineto + -103 callgsubr + -236 hlineto + endchar + + + rlineto + 132 hlineto + -103 callgsubr + -196 hlineto + return + + + rmoveto + -10 10 20 -10 22 hhcurveto + 38 30 30 50 hvcurveto + return + + + 120 70 -30 vlineto + -7 -3 3 7 hvcurveto + endchar + + + 120 350 rmoveto + -67 callgsubr + -70 return + + + 131 -110 rmoveto + 405 hlineto + 41 70 rlineto + return + + + hlineto + -96 -54 -78 -82 -104 86 -56 113 return + + + 110 rmoveto + 7 7 1 1 6 hvcurveto + -42 return + + + vlineto + -80 -20 rlineto + -470 -105 callgsubr + + + -11 -9 -9 -11 -85 callgsubr + vhcurveto + return + + + 140 350 rmoveto + -91 -70 91 -70 return + + + 447 vmoveto + -49 49 49 vlineto + endchar + + + -210 -70 140 -70 -140 return + + + -16 -13 -13 -16 -16 13 -13 16 return + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Arab + + + Arab + + + + diff --git a/Tests/ttLib/removeOverlaps_test.py b/Tests/ttLib/removeOverlaps_test.py new file mode 100644 index 00000000..1320c9be --- /dev/null +++ b/Tests/ttLib/removeOverlaps_test.py @@ -0,0 +1,51 @@ +import logging +import pytest + +pathops = pytest.importorskip("pathops") + +from fontTools.ttLib.removeOverlaps import _simplify, _round_path + + +def test_pathops_simplify_bug_workaround(caplog): + # Paths extracted from Noto Sans Ethiopic instance that fails skia-pathops + # https://github.com/google/fonts/issues/3365 + # https://bugs.chromium.org/p/skia/issues/detail?id=11958 + path = pathops.Path() + path.moveTo(550.461, 0) + path.lineTo(550.461, 366.308) + path.lineTo(713.229, 366.308) + path.lineTo(713.229, 0) + path.close() + path.moveTo(574.46, 0) + path.lineTo(574.46, 276.231) + path.lineTo(737.768, 276.231) + path.quadTo(820.075, 276.231, 859.806, 242.654) + path.quadTo(899.537, 209.077, 899.537, 144.154) + path.quadTo(899.537, 79, 853.46, 39.5) + path.quadTo(807.383, 0, 712.383, 0) + path.close() + + # check that it fails without workaround + with pytest.raises(pathops.PathOpsError): + pathops.simplify(path) + + # check our workaround works (but with a warning) + with caplog.at_level(logging.DEBUG, logger="fontTools.ttLib.removeOverlaps"): + result = _simplify(path, debugGlyphName="a") + + assert "skia-pathops failed to simplify 'a' with float coordinates" in caplog.text + + expected = pathops.Path() + expected.moveTo(550, 0) + expected.lineTo(550, 366) + expected.lineTo(713, 366) + expected.lineTo(713, 276) + expected.lineTo(738, 276) + expected.quadTo(820, 276, 860, 243) + expected.quadTo(900, 209, 900, 144) + expected.quadTo(900, 79, 853, 40) + expected.quadTo(807.242, 0.211, 713, 0.001) + expected.lineTo(713, 0) + expected.close() + + assert expected == _round_path(result, round=lambda v: round(v, 3)) diff --git a/Tests/ttLib/tables/C_O_L_R_test.py b/Tests/ttLib/tables/C_O_L_R_test.py index 4855f58f..aaf33003 100644 --- a/Tests/ttLib/tables/C_O_L_R_test.py +++ b/Tests/ttLib/tables/C_O_L_R_test.py @@ -50,7 +50,9 @@ def diff_binary_fragments(font_bytes, expected_fragments): for expected_bytes, description in expected_fragments: actual_bytes = font_bytes[pos : pos + len(expected_bytes)] if actual_bytes != expected_bytes: - print(f'{description} (previous "{prev_desc}", actual_bytes: {"".join("%02x" % v for v in actual_bytes)} bytes: {str(font_bytes[pos:pos+16])}') + print( + f'{description} (previous "{prev_desc}", actual_bytes: {"".join("%02x" % v for v in actual_bytes)} bytes: {str(font_bytes[pos:pos+16])}' + ) errors += 1 pos += len(expected_bytes) prev_desc = description @@ -102,13 +104,15 @@ COLR_V1_SAMPLE = ( (b"\x00\x01", "Version (1)"), (b"\x00\x01", "BaseGlyphRecordCount (1)"), ( - b"\x00\x00\x00\x1a", - "Offset to BaseGlyphRecordArray from beginning of table (26)", + b"\x00\x00\x00\x22", + "Offset to BaseGlyphRecordArray from beginning of table (34)", ), - (b"\x00\x00\x00 ", "Offset to LayerRecordArray from beginning of table (32)"), + (b"\x00\x00\x00\x28", "Offset to LayerRecordArray from beginning of table (40)"), (b"\x00\x03", "LayerRecordCount (3)"), - (b"\x00\x00\x00,", "Offset to BaseGlyphV1List from beginning of table (44)"), - (b"\x00\x00\x00\xac", "Offset to LayerV1List from beginning of table (172)"), + (b"\x00\x00\x00\x34", "Offset to BaseGlyphList from beginning of table (52)"), + (b"\x00\x00\x00\x9f", "Offset to LayerList from beginning of table (159)"), + (b"\x00\x00\x01\x62", "Offset to ClipList (354)"), + (b"\x00\x00\x00\x00", "Offset to DeltaSetIndexMap (NULL)"), (b"\x00\x00\x00\x00", "Offset to VarStore (NULL)"), (b"\x00\x06", "BaseGlyphRecord[0].BaseGlyph (6)"), (b"\x00\x00", "BaseGlyphRecord[0].FirstLayerIndex (0)"), @@ -119,92 +123,93 @@ COLR_V1_SAMPLE = ( (b"\x00\x01", "LayerRecord[1].PaletteIndex (1)"), (b"\x00\t", "LayerRecord[2].LayerGlyph (9)"), (b"\x00\x02", "LayerRecord[2].PaletteIndex (2)"), - # BaseGlyphV1List - (b"\x00\x00\x00\x03", "BaseGlyphV1List.BaseGlyphCount (3)"), - (b"\x00\n", "BaseGlyphV1List.BaseGlyphV1Record[0].BaseGlyph (10)"), + # BaseGlyphList + (b"\x00\x00\x00\x03", "BaseGlyphList.BaseGlyphCount (3)"), + (b"\x00\n", "BaseGlyphList.BaseGlyphPaintRecord[0].BaseGlyph (10)"), ( b"\x00\x00\x00\x16", - "Offset to Paint table from beginning of BaseGlyphV1List (22)", + "Offset to Paint table from beginning of BaseGlyphList (22)", ), - (b"\x00\x0e", "BaseGlyphV1List.BaseGlyphV1Record[1].BaseGlyph (14)"), + (b"\x00\x0e", "BaseGlyphList.BaseGlyphPaintRecord[1].BaseGlyph (14)"), ( b"\x00\x00\x00\x1c", - "Offset to Paint table from beginning of BaseGlyphV1List (28)", + "Offset to Paint table from beginning of BaseGlyphList (28)", ), - (b"\x00\x0f", "BaseGlyphV1List.BaseGlyphV1Record[2].BaseGlyph (15)"), + (b"\x00\x0f", "BaseGlyphList.BaseGlyphPaintRecord[2].BaseGlyph (15)"), ( - b"\x00\x00\x00\x5b", - "Offset to Paint table from beginning of BaseGlyphV1List (91)", + b"\x00\x00\x00\x4a", + "Offset to Paint table from beginning of BaseGlyphList (74)", ), - # BaseGlyphV1Record[0] - (b"\x01", "BaseGlyphV1Record[0].Paint.Format (1)"), - (b"\x04", "BaseGlyphV1Record[0].Paint.NumLayers (4)"), - (b"\x00\x00\x00\x00", "BaseGlyphV1Record[0].Paint.FirstLayerIndex (0)"), - # BaseGlyphV1Record[1] - (b"\x14", "BaseGlyphV1Record[1].Paint.Format (20)"), - (b"\x00\x00<", "Offset to SourcePaint from beginning of PaintComposite (60)"), - (b"\x03", "BaseGlyphV1Record[1].Paint.CompositeMode [SRC_OVER] (3)"), + # BaseGlyphPaintRecord[0] + (b"\x01", "BaseGlyphPaintRecord[0].Paint.Format (1)"), + (b"\x04", "BaseGlyphPaintRecord[0].Paint.NumLayers (4)"), + (b"\x00\x00\x00\x00", "BaseGlyphPaintRecord[0].Paint.FirstLayerIndex (0)"), + # BaseGlyphPaintRecord[1] + (b"\x20", "BaseGlyphPaintRecord[1].Paint.Format (32)"), + (b"\x00\x00\x0f", "Offset to SourcePaint from beginning of PaintComposite (15)"), + (b"\x03", "BaseGlyphPaintRecord[1].Paint.CompositeMode [SRC_OVER] (3)"), (b"\x00\x00\x08", "Offset to BackdropPaint from beginning of PaintComposite (8)"), - (b"\x0d", "BaseGlyphV1Record[1].Paint.BackdropPaint.Format (13)"), - (b"\x00\x00\x34", "Offset to Paint from beginning of PaintVarTransform (52)"), - (b"\x00\x01\x00\x00\x00\x00\x00\x00", "Affine2x3.xx.value (1.0)"), - (b"\x00\x00\x00\x00\x00\x00\x00\x00", "Affine2x3.xy.value (0.0)"), - (b"\x00\x00\x00\x00\x00\x00\x00\x00", "Affine2x3.yx.value (0.0)"), - (b"\x00\x01\x00\x00\x00\x00\x00\x00", "Affine2x3.yy.value (1.0)"), - (b"\x01\x2c\x00\x00\x00\x00\x00\x00", "Affine2x3.dx.value (300.0)"), - (b"\x00\x00\x00\x00\x00\x00\x00\x00", "Affine2x3.dy.value (0.0)"), - (b"\x0b", "BaseGlyphV1Record[1].Paint.SourcePaint.Format (11)"), - (b"\x00\n", "BaseGlyphV1Record[1].Paint.SourcePaint.Glyph (10)"), - # BaseGlyphV1Record[2] - (b"\x0a", "BaseGlyphV1Record[2].Paint.Format (10)"), + (b"\x0d", "BaseGlyphPaintRecord[1].Paint.BackdropPaint.Format (13)"), + (b"\x00\x00\x07", "Offset to Paint from beginning of PaintVarTransform (7)"), + (b"\x00\x00\x0a", "Offset to VarAffine2x3 from beginning of PaintVarTransform (10)"), + (b"\x0b", "BaseGlyphPaintRecord[1].Paint.BackdropPaint.Format (11)"), + (b"\x00\x0a", "BaseGlyphPaintRecord[1].Paint.BackdropPaint.Glyph (10)"), + (b"\x00\x01\x00\x00", "VarAffine2x3.xx (1.0)"), + (b"\x00\x00\x00\x00", "VarAffine2x3.xy (0.0)"), + (b"\x00\x00\x00\x00", "VarAffine2x3.yx (0.0)"), + (b"\x00\x01\x00\x00", "VarAffine2x3.yy (1.0)"), + (b"\x01\x2c\x00\x00", "VarAffine2x3.dx (300.0)"), + (b"\x00\x00\x00\x00", "VarAffine2x3.dy (0.0)"), + (b"\x00\x00\x00\x00", "VarIndexBase (0)"), + (b"\x0a", "BaseGlyphPaintRecord[1].Paint.SourcePaint.Format (10)"), (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"), - (b"\x00\x0b", "BaseGlyphV1Record[2].Paint.Glyph (11)"), - (b"\x08", "BaseGlyphV1Record[2].Paint.Paint.Format (8)"), - (b"\x00\x00\x10", "Offset to ColorLine from beginning of PaintSweepGradient (16)"), + (b"\x00\x0b", "BaseGlyphPaintRecord[1].Paint.SourcePaint.Glyph (11)"), + (b"\x08", "BaseGlyphPaintRecord[1].Paint.SourcePaint.Paint.Format (8)"), + (b"\x00\x00\x0c", "Offset to ColorLine from beginning of PaintSweepGradient (12)"), (b"\x01\x03", "centerX (259)"), (b"\x01\x2c", "centerY (300)"), - (b"\x00\x2d\x00\x00", "startAngle (45.0)"), - (b"\x00\x87\x00\x00", "endAngle (135.0)"), + (b"\x10\x00", "startAngle (0.25)"), + (b"\x30\x00", "endAngle (0.75)"), (b"\x00", "ColorLine.Extend (0; pad)"), (b"\x00\x02", "ColorLine.StopCount (2)"), (b"\x00\x00", "ColorLine.ColorStop[0].StopOffset (0.0)"), - (b"\x00\x03", "ColorLine.ColorStop[0].Color.PaletteIndex (3)"), - (b"@\x00", "ColorLine.ColorStop[0].Color.Alpha (1.0)"), + (b"\x00\x03", "ColorLine.ColorStop[0].PaletteIndex (3)"), + (b"@\x00", "ColorLine.ColorStop[0].Alpha (1.0)"), (b"@\x00", "ColorLine.ColorStop[1].StopOffset (1.0)"), - (b"\x00\x05", "ColorLine.ColorStop[1].Color.PaletteIndex (5)"), - (b"@\x00", "ColorLine.ColorStop[1].Color.Alpha (1.0)"), - # LayerV1List - (b"\x00\x00\x00\x04", "LayerV1List.LayerCount (4)"), + (b"\x00\x05", "ColorLine.ColorStop[1].PaletteIndex (5)"), + (b"@\x00", "ColorLine.ColorStop[1].Alpha (1.0)"), + # LayerList + (b"\x00\x00\x00\x04", "LayerList.LayerCount (4)"), ( b"\x00\x00\x00\x14", - "First Offset to Paint table from beginning of LayerV1List (20)", + "First Offset to Paint table from beginning of LayerList (20)", ), ( b"\x00\x00\x00\x23", - "Second Offset to Paint table from beginning of LayerV1List (35)", + "Second Offset to Paint table from beginning of LayerList (35)", ), ( b"\x00\x00\x00\x4e", - "Third Offset to Paint table from beginning of LayerV1List (78)", + "Third Offset to Paint table from beginning of LayerList (78)", ), ( - b"\x00\x00\x00\xb7", - "Fourth Offset to Paint table from beginning of LayerV1List (183)", + b"\x00\x00\x00\x9e", + "Fourth Offset to Paint table from beginning of LayerList (158)", ), - # PaintGlyph glyph00011 - (b"\x0a", "LayerV1List.Paint[0].Format (10)"), - (b"\x00\x00\x06", "Offset24 to Paint subtable from beginning of PaintGlyph (6)"), - (b"\x00\x0b", "LayerV1List.Paint[0].Glyph (glyph00011)"), + # BaseGlyphPaintRecord[2] + (b"\x0a", "BaseGlyphPaintRecord[2].Paint.Format (10)"), + (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"), + (b"\x00\x0b", "BaseGlyphPaintRecord[2].Paint.Glyph (11)"), # PaintVarSolid - (b"\x03", "LayerV1List.Paint[0].Paint.Format (3)"), - (b"\x00\x02", "Paint.Color.PaletteIndex (2)"), - (b" \x00", "Paint.Color.Alpha.value (0.5)"), - (b"\x00\x00\x00\x00", "Paint.Color.Alpha.varIdx (0)"), + (b"\x03", "LayerList.Paint[0].Paint.Format (3)"), + (b"\x00\x02", "Paint.PaletteIndex (2)"), + (b" \x00", "Paint.Alpha.value (0.5)"), + (b"\x00\x00\x00\x06", "VarIndexBase (6)"), # PaintGlyph glyph00012 - (b"\x0a", "LayerV1List.Paint[1].Format (10)"), + (b"\x0a", "LayerList.Paint[1].Format (10)"), (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"), - (b"\x00\x0c", "LayerV1List.Paint[1].Glyph (glyph00012)"), - (b"\x04", "LayerV1List.Paint[1].Paint.Format (4)"), + (b"\x00\x0c", "LayerList.Paint[1].Glyph (glyph00012)"), + (b"\x04", "LayerList.Paint[1].Paint.Format (4)"), (b"\x00\x00\x10", "Offset to ColorLine from beginning of PaintLinearGradient (16)"), (b"\x00\x01", "Paint.x0 (1)"), (b"\x00\x02", "Paint.y0 (2)"), @@ -215,68 +220,105 @@ COLR_V1_SAMPLE = ( (b"\x01", "ColorLine.Extend (1; repeat)"), (b"\x00\x03", "ColorLine.StopCount (3)"), (b"\x00\x00", "ColorLine.ColorStop[0].StopOffset (0.0)"), - (b"\x00\x03", "ColorLine.ColorStop[0].Color.PaletteIndex (3)"), - (b"@\x00", "ColorLine.ColorStop[0].Color.Alpha (1.0)"), + (b"\x00\x03", "ColorLine.ColorStop[0].PaletteIndex (3)"), + (b"@\x00", "ColorLine.ColorStop[0].Alpha (1.0)"), (b" \x00", "ColorLine.ColorStop[1].StopOffset (0.5)"), - (b"\x00\x04", "ColorLine.ColorStop[1].Color.PaletteIndex (4)"), - (b"@\x00", "ColorLine.ColorStop[1].Color.Alpha (1.0)"), + (b"\x00\x04", "ColorLine.ColorStop[1].PaletteIndex (4)"), + (b"@\x00", "ColorLine.ColorStop[1].Alpha (1.0)"), (b"@\x00", "ColorLine.ColorStop[2].StopOffset (1.0)"), - (b"\x00\x05", "ColorLine.ColorStop[2].Color.PaletteIndex (5)"), - (b"@\x00", "ColorLine.ColorStop[2].Color.Alpha (1.0)"), + (b"\x00\x05", "ColorLine.ColorStop[2].PaletteIndex (5)"), + (b"@\x00", "ColorLine.ColorStop[2].Alpha (1.0)"), # PaintGlyph glyph00013 - (b"\x0a", "LayerV1List.Paint[2].Format (10)"), + (b"\x0a", "LayerList.Paint[2].Format (10)"), (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"), - (b"\x00\r", "LayerV1List.Paint[2].Glyph (13)"), - (b"\x0c", "LayerV1List.Paint[2].Paint.Format (12)"), - (b"\x00\x00\x1c", "Offset to Paint subtable from beginning of PaintTransform (28)"), + (b"\x00\x0d", "LayerList.Paint[2].Glyph (13)"), + (b"\x0c", "LayerList.Paint[2].Paint.Format (12)"), + (b"\x00\x00\x07", "Offset to Paint subtable from beginning of PaintTransform (7)"), + (b"\x00\x00\x32", "Offset to Affine2x3 subtable from beginning of PaintTransform (50)"), + (b"\x07", "LayerList.Paint[2].Paint.Paint.Format (7)"), + (b"\x00\x00\x14", "Offset to ColorLine from beginning of PaintVarRadialGradient (20)"), + (b"\x00\x07", "Paint.x0.value (7)"), + (b"\x00\x08", "Paint.y0.value (8)"), + (b"\x00\t", "Paint.r0.value (9)"), + (b"\x00\n", "Paint.x1.value (10)"), + (b"\x00\x0b", "Paint.y1.value (11)"), + (b"\x00\x0c", "Paint.r1.value (12)"), + (b"\xff\xff\xff\xff", "VarIndexBase (0xFFFFFFFF)"), + (b"\x00", "ColorLine.Extend (0; pad)"), + (b"\x00\x02", "ColorLine.StopCount (2)"), + (b"\x00\x00", "ColorLine.ColorStop[0].StopOffset.value (0.0)"), + (b"\x00\x06", "ColorLine.ColorStop[0].PaletteIndex (6)"), + (b"@\x00", "ColorLine.ColorStop[0].Alpha.value (1.0)"), + (b"\xff\xff\xff\xff", "VarIndexBase (0xFFFFFFFF)"), + (b"@\x00", "ColorLine.ColorStop[1].StopOffset.value (1.0)"), + (b"\x00\x07", "ColorLine.ColorStop[1].PaletteIndex (7)"), + (b"\x19\x9a", "ColorLine.ColorStop[1].Alpha.value (0.4)"), + + (b"\x00\x00\x00\x07", "VarIndexBase (7)"), (b"\xff\xf3\x00\x00", "Affine2x3.xx (-13)"), (b"\x00\x0e\x00\x00", "Affine2x3.xy (14)"), (b"\x00\x0f\x00\x00", "Affine2x3.yx (15)"), (b"\xff\xef\x00\x00", "Affine2x3.yy (-17)"), (b"\x00\x12\x00\x00", "Affine2x3.yy (18)"), (b"\x00\x13\x00\x00", "Affine2x3.yy (19)"), - (b"\x07", "LayerV1List.Paint[2].Paint.Paint.Format (7)"), - (b"\x00\x00(", "Offset to ColorLine from beginning of PaintVarRadialGradient (40)"), - (b"\x00\x07\x00\x00\x00\x00", "Paint.x0.value (7)"), - (b"\x00\x08\x00\x00\x00\x00", "Paint.y0.value (8)"), - (b"\x00\t\x00\x00\x00\x00", "Paint.r0.value (9)"), - (b"\x00\n\x00\x00\x00\x00", "Paint.x1.value (10)"), - (b"\x00\x0b\x00\x00\x00\x00", "Paint.y1.value (11)"), - (b"\x00\x0c\x00\x00\x00\x00", "Paint.r1.value (12)"), - (b"\x00", "ColorLine.Extend (0; pad)"), - (b"\x00\x02", "ColorLine.StopCount (2)"), - (b"\x00\x00\x00\x00\x00\x00", "ColorLine.ColorStop[0].StopOffset.value (0.0)"), - (b"\x00\x06", "ColorLine.ColorStop[0].Color.PaletteIndex (6)"), - (b"@\x00\x00\x00\x00\x00", "ColorLine.ColorStop[0].Color.Alpha.value (1.0)"), - (b"@\x00\x00\x00\x00\x00", "ColorLine.ColorStop[1].StopOffset.value (1.0)"), - (b"\x00\x07", "ColorLine.ColorStop[1].Color.PaletteIndex (7)"), - (b"\x19\x9a\x00\x00\x00\x00", "ColorLine.ColorStop[1].Color.Alpha.value (0.4)"), + # PaintTranslate - (b"\x0e", "LayerV1List.Paint[3].Format (14)"), - (b"\x00\x00\x0c", "Offset to Paint subtable from beginning of PaintTranslate (12)"), - (b"\x01\x01\x00\x00", "dx (257)"), - (b"\x01\x02\x00\x00", "dy (258)"), - # PaintRotate - (b"\x10", "LayerV1List.Paint[3].Paint.Format (16)"), - (b"\x00\x00\x10", "Offset to Paint subtable from beginning of PaintRotate (16)"), - (b"\x00\x2d\x00\x00", "angle (45)"), - (b"\x00\xff\x00\x00", "centerX (255)"), - (b"\x01\x00\x00\x00", "centerY (256)"), + (b"\x0e", "LayerList.Paint[3].Format (14)"), + (b"\x00\x00\x08", "Offset to Paint subtable from beginning of PaintTranslate (8)"), + (b"\x01\x01", "dx (257)"), + (b"\x01\x02", "dy (258)"), + + # PaintRotateAroundCenter + (b"\x1a", "LayerList.Paint[3].Paint.Format (26)"), + ( + b"\x00\x00\x0a", + "Offset to Paint subtable from beginning of PaintRotateAroundCenter (11)", + ), + (b"\x10\x00", "angle (0.25)"), + (b"\x00\xff", "centerX (255)"), + (b"\x01\x00", "centerY (256)"), + # PaintSkew - (b"\x12", "LayerV1List.Paint[3].Paint.Paint.Format (18)"), - (b"\x00\x00\x14", "Offset to Paint subtable from beginning of PaintSkew (20)"), - (b"\xff\xf5\x00\x00", "xSkewAngle (-11)"), - (b"\x00\x05\x00\x00", "ySkewAngle (5)"), - (b"\x00\xfd\x00\x00", "centerX.value (253)"), - (b"\x00\xfe\x00\x00", "centerY.value (254)"), + (b"\x1c", "LayerList.Paint[3].Paint.Paint.Format (28)"), + ( + b"\x00\x00\x08", + "Offset to Paint subtable from beginning of PaintSkew (8)", + ), + (b"\xfc\x17", "xSkewAngle (-0.0611)"), + (b"\x01\xc7", "ySkewAngle (0.0278)"), + # PaintGlyph - (b"\x0a", "LayerV1List.Paint[3].Paint.Paint.Paint.Format (10)"), + (b"\x0a", "LayerList.Paint[3].Paint.Paint.Paint.Format (10)"), (b"\x00\x00\x06", "Offset to Paint subtable from beginning of PaintGlyph (6)"), - (b"\x00\x0b", "LayerV1List.Paint[2].Glyph (11)"), + (b"\x00\x0b", "LayerList.Paint[2].Glyph (11)"), + # PaintSolid - (b"\x02", "LayerV1List.Paint[0].Paint.Paint.Paint.Paint.Format (2)"), - (b"\x00\x02", "Paint.Color.PaletteIndex (2)"), - (b" \x00", "Paint.Color.Alpha (0.5)"), + (b"\x02", "LayerList.Paint[0].Paint.Paint.Paint.Paint.Format (2)"), + (b"\x00\x02", "Paint.PaletteIndex (2)"), + (b" \x00", "Paint.Alpha (0.5)"), + + # ClipList + (b'\x01', "ClipList.Format (1)"), + (b'\x00\x00\x00\x02', "ClipList.ClipCount (2)"), + (b'\x00\x0a', "ClipRecord[0].StartGlyphID (10)"), + (b'\x00\x0a', "ClipRecord[0].EndGlyphID (10)"), + (b'\x00\x00\x13', "Offset to ClipBox subtable from beginning of ClipList (19)"), + (b'\x00\x0e', "ClipRecord[1].StartGlyphID (14)"), + (b'\x00\x0f', "ClipRecord[1].EndGlyphID (15)"), + (b'\x00\x00\x20', "Offset to ClipBox subtable from beginning of ClipList (32)"), + + (b'\x02', "ClipBox.Format (2)"), + (b'\x00\x00', "ClipBox.xMin (0)"), + (b'\x00\x00', "ClipBox.yMin (0)"), + (b'\x01\xf4', "ClipBox.xMax (500)"), + (b'\x01\xf4', "ClipBox.yMax (500)"), + (b'\x00\x00\x00\t', "ClipBox.VarIndexBase (9)"), + + (b'\x01', "ClipBox.Format (1)"), + (b'\x00\x00', "ClipBox.xMin (0)"), + (b'\x00\x00', "ClipBox.yMin (0)"), + (b'\x03\xe8', "ClipBox.xMax (1000)"), + (b'\x03\xe8', "ClipBox.yMax (1000)"), ) COLR_V1_DATA = b"".join(t[0] for t in COLR_V1_SAMPLE) @@ -306,18 +348,18 @@ COLR_V1_XML = [ " ", "", "", - "", + "", " ", - ' ', + ' ', ' ', ' ', ' ', ' ', " ", - " ", - ' ', + " ", + ' ', ' ', - ' ', + ' ', ' ', ' ', " ", @@ -333,11 +375,12 @@ COLR_V1_XML = [ ' ', ' ', ' ', + ' ', " ", " ", " ", - " ", - ' ', + " ", + ' ', ' ', ' ', ' ', @@ -346,17 +389,13 @@ COLR_V1_XML = [ " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', " ", " ", ' ', @@ -366,16 +405,15 @@ COLR_V1_XML = [ " ", ' ', " ", - " ", - "", - "", + " ", + "", + "", " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', + ' ', " ", ' ', " ", @@ -386,24 +424,18 @@ COLR_V1_XML = [ " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', " ", " ", ' ', @@ -423,17 +455,15 @@ COLR_V1_XML = [ " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', + " ", " ", ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', + ' ', " ", " ", ' ', @@ -442,6 +472,7 @@ COLR_V1_XML = [ ' ', ' ', ' ', + " ", " ", " ", ' ', @@ -455,30 +486,99 @@ COLR_V1_XML = [ ' ', " ", ' ', - ' ', - ' ', + ' ', + ' ', ' ', ' ', - " ", - ' ', - ' ', - " ", + ' ', + ' ', " ", ' ', " ", ' ', ' ', - ' ', - ' ', " ", ' ', - ' ', - ' ', + ' ', + ' ', " ", - ' ', - ' ', + ' ', + ' ', " ", - "", + "", + '', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + "", +] + +COLR_V1_VAR_XML = [ + '', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + "", + '', + ' ', + " ", + " ", + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + " ", + " ", + " ", + ' ', + " ", + ' ', + " ", + ' ', + ' ', + ' ', + ' ', + ' ', + " ", + ' ', + " ", + ' ', + " ", + ' ', + ' ', + ' ', + " ", + "", ] @@ -510,3 +610,16 @@ class COLR_V1_Test(object): colr = table_C_O_L_R_() colr.decompile(compiled, font) assert getXML(colr.toXML, font) == COLR_V1_XML + + +class COLR_V1_Variable_Test(object): + def test_round_trip_xml(self, font): + colr = table_C_O_L_R_() + xml = COLR_V1_XML + COLR_V1_VAR_XML + for name, attrs, content in parseXML(xml): + colr.fromXML(name, attrs, content, font) + compiled = colr.compile(font) + + colr = table_C_O_L_R_() + colr.decompile(compiled, font) + assert getXML(colr.toXML, font) == xml diff --git a/Tests/ttLib/tables/M_V_A_R_test.py b/Tests/ttLib/tables/M_V_A_R_test.py index 3972d8c3..a8b092e0 100644 --- a/Tests/ttLib/tables/M_V_A_R_test.py +++ b/Tests/ttLib/tables/M_V_A_R_test.py @@ -8,8 +8,8 @@ import unittest MVAR_DATA = deHexStr( '0001 0000 ' # 0: version=1.0 '0000 0008 ' # 4: reserved=0, valueRecordSize=8 - '0007 ' # 8: valueRecordCount=7 - '0044 ' # 10: offsetToItemVariationStore=68 + '0009 ' # 8: valueRecordCount=9 + '0054 ' # 10: offsetToItemVariationStore=84 '6861 7363 ' # 12: ValueRecord.valueTag="hasc" '0000 ' # 16: ValueRecord.deltaSetOuterIndex '0003 ' # 18: ValueRecord.deltaSetInnerIndex @@ -31,30 +31,36 @@ MVAR_DATA = deHexStr( '7370 796F ' # 60: ValueRecord.valueTag="spyo" '0000 ' # 64: ValueRecord.deltaSetOuterIndex '0002 ' # 66: ValueRecord.deltaSetInnerIndex - '0001 ' # 68: VarStore.format=1 - '0000 000C ' # 70: VarStore.offsetToVariationRegionList=12 - '0001 ' # 74: VarStore.itemVariationDataCount=1 - '0000 0016 ' # 76: VarStore.itemVariationDataOffsets[0]=22 - '0001 ' # 80: VarRegionList.axisCount=1 - '0001 ' # 82: VarRegionList.regionCount=1 - '0000 ' # 84: variationRegions[0].regionAxes[0].startCoord=0.0 - '4000 ' # 86: variationRegions[0].regionAxes[0].peakCoord=1.0 - '4000 ' # 88: variationRegions[0].regionAxes[0].endCoord=1.0 - '0004 ' # 90: VarData.ItemCount=4 - '0001 ' # 92: VarData.NumShorts=1 - '0001 ' # 94: VarData.VarRegionCount=1 - '0000 ' # 96: VarData.VarRegionIndex[0]=0 - 'FF38 ' # 98: VarData.deltaSets[0]=-200 - 'FFCE ' # 100: VarData.deltaSets[0]=-50 - '0064 ' # 102: VarData.deltaSets[0]=100 - '00C8 ' # 104: VarData.deltaSets[0]=200 + '7465 7374 ' # 68: ValueRecord.valueTag="test" + '0000 ' # 72: ValueRecord.deltaSetOuterIndex + '0002 ' # 74: ValueRecord.deltaSetInnerIndex + '7465 7332 ' # 76: ValueRecord.valueTag="tes2" + '0000 ' # 78: ValueRecord.deltaSetOuterIndex + '0002 ' # 82: ValueRecord.deltaSetInnerIndex + '0001 ' # 84: VarStore.format=1 + '0000 000C ' # 86: VarStore.offsetToVariationRegionList=12 + '0001 ' # 90: VarStore.itemVariationDataCount=1 + '0000 0016 ' # 92: VarStore.itemVariationDataOffsets[0]=22 + '0001 ' # 96: VarRegionList.axisCount=1 + '0001 ' # 98: VarRegionList.regionCount=1 + '0000 ' # 100: variationRegions[0].regionAxes[0].startCoord=0.0 + '4000 ' # 102: variationRegions[0].regionAxes[0].peakCoord=1.0 + '4000 ' # 104: variationRegions[0].regionAxes[0].endCoord=1.0 + '0004 ' # 106: VarData.ItemCount=4 + '0001 ' # 108: VarData.NumShorts=1 + '0001 ' # 110: VarData.VarRegionCount=1 + '0000 ' # 112: VarData.VarRegionIndex[0]=0 + 'FF38 ' # 114: VarData.deltaSets[0]=-200 + 'FFCE ' # 116: VarData.deltaSets[0]=-50 + '0064 ' # 118: VarData.deltaSets[0]=100 + '00C8 ' # 120: VarData.deltaSets[0]=200 ) MVAR_XML = [ '', '', '', - '', + '', '', ' ', ' ', @@ -108,6 +114,14 @@ MVAR_XML = [ ' ', ' ', '', + '', + ' ', + ' ', + '', + '', + ' ', + ' ', + '', ] @@ -123,6 +137,13 @@ class MVARTest(unittest.TestCase): mvar.decompile(MVAR_DATA, font) self.assertEqual(getXML(mvar.toXML), MVAR_XML) + + def test_decompile_toXML_lazy(self): + mvar = newTable('MVAR') + font = TTFont(lazy=True) + mvar.decompile(MVAR_DATA, font) + self.assertEqual(getXML(mvar.toXML), MVAR_XML) + def test_compile_fromXML(self): mvar = newTable('MVAR') font = TTFont() diff --git a/Tests/ttLib/tables/S_V_G__test.py b/Tests/ttLib/tables/S_V_G__test.py new file mode 100644 index 00000000..91b0f23a --- /dev/null +++ b/Tests/ttLib/tables/S_V_G__test.py @@ -0,0 +1,131 @@ +import struct + +from fontTools.misc import etree +from fontTools.misc.testTools import getXML, parseXML +from fontTools.ttLib import TTFont +from fontTools.ttLib.tables.S_V_G_ import table_S_V_G_ + +import pytest + + +def dump(table, ttFont=None): + print("\n".join(getXML(table.toXML, ttFont))) + + +def strip_xml_whitespace(xml_string): + def strip_or_none(text): + text = text.strip() if text else None + return text if text else None + + tree = etree.fromstring(xml_string) + for e in tree.iter("*"): + e.text = strip_or_none(e.text) + e.tail = strip_or_none(e.tail) + return etree.tostring(tree, encoding="utf-8") + + +SVG_DOCS = [ + strip_xml_whitespace(svg) + for svg in ( + b"""\ + + + + + + + + + + + + + + """, + b"""\ + + + + + """, + ) +] + + +OTSVG_DATA = b"".join( + [ + # SVG table header + b"\x00\x00" # version (0) + b"\x00\x00\x00\x0a" # offset to SVGDocumentList (10) + b"\x00\x00\x00\x00" # reserved (0) + # SVGDocumentList + b"\x00\x03" # number of SVGDocumentRecords (3) + # SVGDocumentRecord[0] + b"\x00\x01" # startGlyphID (1) + b"\x00\x02" # endGlyphID (2) + b"\x00\x00\x00\x26" # svgDocOffset (2 + 12*3 == 38 == 0x26) + + struct.pack(">L", len(SVG_DOCS[0])) # svgDocLength + # SVGDocumentRecord[1] + + b"\x00\x03" # startGlyphID (3) + b"\x00\x03" # endGlyphID (3) + + struct.pack(">L", 0x26 + len(SVG_DOCS[0])) # svgDocOffset + + struct.pack(">L", len(SVG_DOCS[1])) # svgDocLength + # SVGDocumentRecord[2] + + b"\x00\x04" # startGlyphID (4) + b"\x00\x04" # endGlyphID (4) + b"\x00\x00\x00\x26" # svgDocOffset (38); records 0 and 2 point to same SVG doc + + struct.pack(">L", len(SVG_DOCS[0])) # svgDocLength + ] + + SVG_DOCS +) + +OTSVG_TTX = [ + '', + f" ", + "", + '', + f" ", + "", + '', + f" ", + "", +] + + +@pytest.fixture +def font(): + font = TTFont() + font.setGlyphOrder([".notdef"] + ["glyph%05d" % i for i in range(1, 30)]) + return font + + +def test_decompile_and_compile(font): + table = table_S_V_G_() + table.decompile(OTSVG_DATA, font) + assert table.compile(font) == OTSVG_DATA + + +def test_decompile_and_dump_ttx(font): + table = table_S_V_G_() + table.decompile(OTSVG_DATA, font) + + dump(table, font) + assert getXML(table.toXML, font) == OTSVG_TTX + + +def test_load_from_ttx_and_compile(font): + table = table_S_V_G_() + for name, attrs, content in parseXML(OTSVG_TTX): + table.fromXML(name, attrs, content, font) + assert table.compile(font) == OTSVG_DATA + + +def test_round_trip_ttx(font): + table = table_S_V_G_() + for name, attrs, content in parseXML(OTSVG_TTX): + table.fromXML(name, attrs, content, font) + compiled = table.compile(font) + + table = table_S_V_G_() + table.decompile(compiled, font) + assert getXML(table.toXML, font) == OTSVG_TTX diff --git a/Tests/ttLib/tables/T_S_I__1_test.py b/Tests/ttLib/tables/T_S_I__1_test.py index 3a565adc..b792221e 100644 --- a/Tests/ttLib/tables/T_S_I__1_test.py +++ b/Tests/ttLib/tables/T_S_I__1_test.py @@ -1,5 +1,5 @@ -from fontTools.misc.py23 import tobytes from fontTools.misc.loggingTools import CapturingLogHandler +from fontTools.misc.textTools import tobytes from fontTools.ttLib import TTFont, TTLibError from fontTools.ttLib.tables.T_S_I__0 import table_T_S_I__0 from fontTools.ttLib.tables.T_S_I__1 import table_T_S_I__1 diff --git a/Tests/ttLib/tables/TupleVariation_test.py b/Tests/ttLib/tables/TupleVariation_test.py index d7a0bc8a..99b94918 100644 --- a/Tests/ttLib/tables/TupleVariation_test.py +++ b/Tests/ttLib/tables/TupleVariation_test.py @@ -231,8 +231,7 @@ class TupleVariationTest(unittest.TestCase): [(7,4), (8,5), (9,6)]) axisTags = ["wght", "wdth"] sharedPeakIndices = { var.compileCoord(axisTags): 0x77 } - tup, deltas, _ = var.compile(axisTags, sharedPeakIndices, - sharedPoints={0,1,2}) + tup, deltas = var.compile(axisTags, sharedPeakIndices, pointData=b'') # len(deltas)=8; flags=None; tupleIndex=0x77 # embeddedPeaks=[]; intermediateCoord=[] self.assertEqual("00 08 00 77", hexencode(tup)) @@ -246,8 +245,7 @@ class TupleVariationTest(unittest.TestCase): [(7,4), (8,5), (9,6)]) axisTags = ["wght", "wdth"] sharedPeakIndices = { var.compileCoord(axisTags): 0x77 } - tup, deltas, _ = var.compile(axisTags, sharedPeakIndices, - sharedPoints={0,1,2}) + tup, deltas = var.compile(axisTags, sharedPeakIndices, pointData=b'') # len(deltas)=8; flags=INTERMEDIATE_REGION; tupleIndex=0x77 # embeddedPeak=[]; intermediateCoord=[(0.3, 0.1), (0.7, 0.9)] self.assertEqual("00 08 40 77 13 33 06 66 2C CD 39 9A", hexencode(tup)) @@ -261,8 +259,7 @@ class TupleVariationTest(unittest.TestCase): [(7,4), (8,5), (9,6)]) axisTags = ["wght", "wdth"] sharedPeakIndices = { var.compileCoord(axisTags): 0x77 } - tup, deltas, _ = var.compile(axisTags, sharedPeakIndices, - sharedPoints=None) + tup, deltas = var.compile(axisTags, sharedPeakIndices) # len(deltas)=9; flags=PRIVATE_POINT_NUMBERS; tupleIndex=0x77 # embeddedPeak=[]; intermediateCoord=[] self.assertEqual("00 09 20 77", hexencode(tup)) @@ -277,8 +274,7 @@ class TupleVariationTest(unittest.TestCase): [(7,4), (8,5), (9,6)]) axisTags = ["wght", "wdth"] sharedPeakIndices = { var.compileCoord(axisTags): 0x77 } - tuple, deltas, _ = var.compile(axisTags, - sharedPeakIndices, sharedPoints=None) + tuple, deltas = var.compile(axisTags, sharedPeakIndices) # len(deltas)=9; flags=PRIVATE_POINT_NUMBERS; tupleIndex=0x77 # embeddedPeak=[]; intermediateCoord=[(0.0, 0.0), (1.0, 1.0)] self.assertEqual("00 09 60 77 00 00 00 00 40 00 40 00", @@ -292,8 +288,7 @@ class TupleVariationTest(unittest.TestCase): var = TupleVariation( {"wght": (0.0, 0.5, 0.5), "wdth": (0.0, 0.8, 0.8)}, [(7,4), (8,5), (9,6)]) - tup, deltas, _ = var.compile(axisTags=["wght", "wdth"], - sharedCoordIndices={}, sharedPoints={0, 1, 2}) + tup, deltas = var.compile(axisTags=["wght", "wdth"], pointData=b'') # len(deltas)=8; flags=EMBEDDED_PEAK_TUPLE # embeddedPeak=[(0.5, 0.8)]; intermediateCoord=[] self.assertEqual("00 08 80 00 20 00 33 33", hexencode(tup)) @@ -305,8 +300,7 @@ class TupleVariationTest(unittest.TestCase): var = TupleVariation( {"wght": (0.0, 0.5, 0.5), "wdth": (0.0, 0.8, 0.8)}, [3, 1, 4]) - tup, deltas, _ = var.compile(axisTags=["wght", "wdth"], - sharedCoordIndices={}, sharedPoints={0, 1, 2}) + tup, deltas = var.compile(axisTags=["wght", "wdth"], pointData=b'') # len(deltas)=4; flags=EMBEDDED_PEAK_TUPLE # embeddedPeak=[(0.5, 0.8)]; intermediateCoord=[] self.assertEqual("00 04 80 00 20 00 33 33", hexencode(tup)) @@ -317,9 +311,7 @@ class TupleVariationTest(unittest.TestCase): var = TupleVariation( {"wght": (0.0, 0.5, 1.0), "wdth": (0.0, 0.8, 0.8)}, [(7,4), (8,5), (9,6)]) - tup, deltas, _ = var.compile(axisTags=["wght", "wdth"], - sharedCoordIndices={}, - sharedPoints={0, 1, 2}) + tup, deltas = var.compile(axisTags=["wght", "wdth"], pointData=b'') # len(deltas)=8; flags=EMBEDDED_PEAK_TUPLE # embeddedPeak=[(0.5, 0.8)]; intermediateCoord=[(0.0, 0.0), (1.0, 0.8)] self.assertEqual("00 08 C0 00 20 00 33 33 00 00 00 00 40 00 33 33", @@ -332,8 +324,7 @@ class TupleVariationTest(unittest.TestCase): var = TupleVariation( {"wght": (0.0, 0.5, 0.5), "wdth": (0.0, 0.8, 0.8)}, [(7,4), (8,5), (9,6)]) - tup, deltas, _ = var.compile( - axisTags=["wght", "wdth"], sharedCoordIndices={}, sharedPoints=None) + tup, deltas = var.compile(axisTags=["wght", "wdth"]) # len(deltas)=9; flags=PRIVATE_POINT_NUMBERS|EMBEDDED_PEAK_TUPLE # embeddedPeak=[(0.5, 0.8)]; intermediateCoord=[] self.assertEqual("00 09 A0 00 20 00 33 33", hexencode(tup)) @@ -346,8 +337,7 @@ class TupleVariationTest(unittest.TestCase): var = TupleVariation( {"wght": (0.0, 0.5, 0.5), "wdth": (0.0, 0.8, 0.8)}, [7, 8, 9]) - tup, deltas, _ = var.compile( - axisTags=["wght", "wdth"], sharedCoordIndices={}, sharedPoints=None) + tup, deltas = var.compile(axisTags=["wght", "wdth"]) # len(deltas)=5; flags=PRIVATE_POINT_NUMBERS|EMBEDDED_PEAK_TUPLE # embeddedPeak=[(0.5, 0.8)]; intermediateCoord=[] self.assertEqual("00 05 A0 00 20 00 33 33", hexencode(tup)) @@ -359,9 +349,7 @@ class TupleVariationTest(unittest.TestCase): var = TupleVariation( {"wght": (0.4, 0.5, 0.6), "wdth": (0.7, 0.8, 0.9)}, [(7,4), (8,5), (9,6)]) - tup, deltas, _ = var.compile( - axisTags = ["wght", "wdth"], - sharedCoordIndices={}, sharedPoints=None) + tup, deltas = var.compile(axisTags = ["wght", "wdth"]) # len(deltas)=9; # flags=PRIVATE_POINT_NUMBERS|INTERMEDIATE_REGION|EMBEDDED_PEAK_TUPLE # embeddedPeak=(0.5, 0.8); intermediateCoord=[(0.4, 0.7), (0.6, 0.9)] @@ -376,9 +364,7 @@ class TupleVariationTest(unittest.TestCase): var = TupleVariation( {"wght": (0.4, 0.5, 0.6), "wdth": (0.7, 0.8, 0.9)}, [7, 8, 9]) - tup, deltas, _ = var.compile( - axisTags = ["wght", "wdth"], - sharedCoordIndices={}, sharedPoints=None) + tup, deltas = var.compile(axisTags = ["wght", "wdth"]) # len(deltas)=5; # flags=PRIVATE_POINT_NUMBERS|INTERMEDIATE_REGION|EMBEDDED_PEAK_TUPLE # embeddedPeak=(0.5, 0.8); intermediateCoord=[(0.4, 0.7), (0.6, 0.9)] @@ -415,8 +401,8 @@ class TupleVariationTest(unittest.TestCase): self.assertEqual("7F B9 80 35", hexencode(var.compileCoord(["wght", "wdth"]))) def test_compilePoints(self): - compilePoints = lambda p: TupleVariation.compilePoints(set(p), numPointsInGlyph=999) - self.assertEqual("00", hexencode(compilePoints(range(999)))) # all points in glyph + compilePoints = lambda p: TupleVariation.compilePoints(set(p)) + self.assertEqual("00", hexencode(compilePoints(set()))) # all points in glyph self.assertEqual("01 00 07", hexencode(compilePoints([7]))) self.assertEqual("01 80 FF FF", hexencode(compilePoints([65535]))) self.assertEqual("02 01 09 06", hexencode(compilePoints([9, 15]))) @@ -488,7 +474,7 @@ class TupleVariationTest(unittest.TestCase): def test_decompilePoints_roundTrip(self): numPointsInGlyph = 500 # greater than 255, so we also exercise code path for 16-bit encoding - compile = lambda points: TupleVariation.compilePoints(points, numPointsInGlyph) + compile = lambda points: TupleVariation.compilePoints(points) decompile = lambda data: set(TupleVariation.decompilePoints_(numPointsInGlyph, data, 0, "gvar")[0]) for i in range(50): points = set(random.sample(range(numPointsInGlyph), 30)) @@ -496,18 +482,17 @@ class TupleVariationTest(unittest.TestCase): "failed round-trip decompile/compilePoints; points=%s" % points) allPoints = set(range(numPointsInGlyph)) self.assertSetEqual(allPoints, decompile(compile(allPoints))) + self.assertSetEqual(allPoints, decompile(compile(set()))) def test_compileDeltas_points(self): - var = TupleVariation({}, [(0,0), (1, 0), (2, 0), None, (4, 0), (5, 0)]) - points = {1, 2, 3, 4} + var = TupleVariation({}, [None, (1, 0), (2, 0), None, (4, 0), None]) # deltaX for points: [1, 2, 4]; deltaY for points: [0, 0, 0] - self.assertEqual("02 01 02 04 82", hexencode(var.compileDeltas(points))) + self.assertEqual("02 01 02 04 82", hexencode(var.compileDeltas())) def test_compileDeltas_constants(self): - var = TupleVariation({}, [0, 1, 2, None, 4, 5]) - cvts = {1, 2, 3, 4} + var = TupleVariation({}, [None, 1, 2, None, 4, None]) # delta for cvts: [1, 2, 4] - self.assertEqual("02 01 02 04", hexencode(var.compileDeltas(cvts))) + self.assertEqual("02 01 02 04", hexencode(var.compileDeltas())) def test_compileDeltaValues(self): compileDeltaValues = lambda values: hexencode(TupleVariation.compileDeltaValues_(values)) @@ -549,11 +534,6 @@ class TupleVariationTest(unittest.TestCase): # words, zeroes self.assertEqual("40 66 66 80", compileDeltaValues([0x6666, 0])) self.assertEqual("40 66 66 81", compileDeltaValues([0x6666, 0, 0])) - # bytes or words from floats - self.assertEqual("00 01", compileDeltaValues([1.1])) - self.assertEqual("00 02", compileDeltaValues([1.9])) - self.assertEqual("40 66 66", compileDeltaValues([0x6666 + 0.1])) - self.assertEqual("40 66 66", compileDeltaValues([0x6665 + 0.9])) def test_decompileDeltas(self): decompileDeltas = TupleVariation.decompileDeltas_ @@ -579,8 +559,12 @@ class TupleVariationTest(unittest.TestCase): self.assertListEqual(deltas, decompile(compile(deltas))) def test_compileSharedTuples(self): - # Below, the peak coordinate {"wght": 1.0, "wdth": 0.7} appears - # three times; {"wght": 1.0, "wdth": 0.8} appears twice. + # Below, the peak coordinate {"wght": 1.0, "wdth": 0.8} appears + # three times (most frequent sorted first); {"wght": 1.0, "wdth": 0.5} + # and {"wght": 1.0, "wdth": 0.7} both appears two times (tie) and + # are sorted alphanumerically to ensure determinism. + # The peak coordinate {"wght": 1.0, "wdth": 0.9} appears only once + # and is thus ignored. # Because the start and end of variation ranges is not encoded # into the shared pool, they should get ignored. deltas = [None] * 4 @@ -599,7 +583,7 @@ class TupleVariationTest(unittest.TestCase): }, deltas), TupleVariation({ "wght": (1.0, 1.0, 1.0), - "wdth": (0.3, 0.7, 1.0) + "wdth": (0.3, 0.5, 1.0) }, deltas), TupleVariation({ "wght": (1.0, 1.0, 1.0), @@ -608,11 +592,19 @@ class TupleVariationTest(unittest.TestCase): TupleVariation({ "wght": (1.0, 1.0, 1.0), "wdth": (0.3, 0.9, 1.0) - }, deltas) + }, deltas), + TupleVariation({ + "wght": (1.0, 1.0, 1.0), + "wdth": (0.4, 0.8, 1.0) + }, deltas), + TupleVariation({ + "wght": (1.0, 1.0, 1.0), + "wdth": (0.5, 0.5, 1.0) + }, deltas), ] result = compileSharedTuples(["wght", "wdth"], variations) self.assertEqual([hexencode(c) for c in result], - ["40 00 2C CD", "40 00 33 33"]) + ["40 00 33 33", "40 00 20 00", "40 00 2C CD"]) def test_decompileSharedTuples_Skia(self): sharedTuples = decompileSharedTuples( diff --git a/Tests/ttLib/tables/_g_l_y_f_test.py b/Tests/ttLib/tables/_g_l_y_f_test.py index 531bb82a..84f30dc6 100644 --- a/Tests/ttLib/tables/_g_l_y_f_test.py +++ b/Tests/ttLib/tables/_g_l_y_f_test.py @@ -173,10 +173,9 @@ class GlyphCoordinatesTest(object): assert g[0][0] == otRound(afloat) def test__checkFloat_overflow(self): - g = GlyphCoordinates([(1, 1)], typecode="h") + g = GlyphCoordinates([(1, 1)]) g.append((0x8000, 0)) - assert g.array.typecode == "d" - assert g.array == array.array("d", [1.0, 1.0, 32768.0, 0.0]) + assert list(g.array) == [1.0, 1.0, 32768.0, 0.0] CURR_DIR = os.path.abspath(os.path.dirname(os.path.realpath(__file__))) @@ -363,6 +362,23 @@ class GlyfTableTest(unittest.TestCase): self.assertEqual(font["glyf"][".notdef"].numberOfContours, 0) self.assertEqual(font["glyf"]["space"].numberOfContours, 0) + def test_getPhantomPoints(self): + # https://github.com/fonttools/fonttools/issues/2295 + font = TTFont() + glyphNames = [".notdef"] + font.setGlyphOrder(glyphNames) + font["loca"] = newTable("loca") + font["loca"].locations = [0] * (len(glyphNames) + 1) + font["glyf"] = newTable("glyf") + font["glyf"].decompile(b"\x00", font) + font["hmtx"] = newTable("hmtx") + font["hmtx"].metrics = {".notdef": (100,0)} + font["head"] = newTable("head") + font["head"].unitsPerEm = 1000 + self.assertEqual( + font["glyf"].getPhantomPoints(".notdef", font, 0), + [(0, 0), (100, 0), (0, 0), (0, -1000)] + ) class GlyphTest: diff --git a/Tests/ttLib/tables/_l_t_a_g_test.py b/Tests/ttLib/tables/_l_t_a_g_test.py index fc9be82a..29119903 100644 --- a/Tests/ttLib/tables/_l_t_a_g_test.py +++ b/Tests/ttLib/tables/_l_t_a_g_test.py @@ -1,7 +1,6 @@ from fontTools.misc.testTools import parseXML from fontTools.misc.xmlWriter import XMLWriter from io import BytesIO -import os import struct import unittest from fontTools.ttLib import newTable @@ -46,14 +45,14 @@ class Test_l_t_a_g(unittest.TestCase): table = newTable("ltag") table.decompile(self.DATA_, ttFont=None) table.toXML(writer, ttFont=None) - expected = os.linesep.join([ + expected = "\n".join([ '', '', '', '', '', '' - ]) + os.linesep + ]) + "\n" self.assertEqual(expected.encode("utf_8"), writer.file.getvalue()) diff --git a/Tests/ttLib/tables/_m_o_r_x_test.py b/Tests/ttLib/tables/_m_o_r_x_test.py index 0b807f82..d65619ca 100644 --- a/Tests/ttLib/tables/_m_o_r_x_test.py +++ b/Tests/ttLib/tables/_m_o_r_x_test.py @@ -1,6 +1,5 @@ -from fontTools.misc.py23 import bytechr, bytesjoin from fontTools.misc.testTools import FakeFont, getXML, parseXML -from fontTools.misc.textTools import deHexStr, hexStr +from fontTools.misc.textTools import bytechr, bytesjoin, deHexStr, hexStr from fontTools.ttLib import newTable import unittest diff --git a/Tests/ttLib/tables/_n_a_m_e_test.py b/Tests/ttLib/tables/_n_a_m_e_test.py index 8e829704..5e8a0c2b 100644 --- a/Tests/ttLib/tables/_n_a_m_e_test.py +++ b/Tests/ttLib/tables/_n_a_m_e_test.py @@ -1,12 +1,12 @@ -from fontTools.misc.py23 import bytesjoin, tostr from fontTools.misc import sstruct from fontTools.misc.loggingTools import CapturingLogHandler from fontTools.misc.testTools import FakeFont +from fontTools.misc.textTools import bytesjoin, tostr from fontTools.misc.xmlWriter import XMLWriter from io import BytesIO import struct import unittest -from fontTools.ttLib import newTable +from fontTools.ttLib import TTFont, newTable from fontTools.ttLib.tables._n_a_m_e import ( table__n_a_m_e, NameRecord, nameRecordFormat, nameRecordSize, makeName, log) @@ -305,6 +305,17 @@ class NameTableTest(unittest.TestCase): self.assertGreaterEqual(nameID, 256) self.assertEqual(nameID, table.findMultilingualName(names, minNameID=256)) + def test_addMultilingualName_name_inconsistencies(self): + # Check what happens, when there are + # inconsistencies in the name table + table = table__n_a_m_e() + table.setName('Weight', 270, 3, 1, 0x409) + names = {'en': 'Weight', } + nameID = table.addMultilingualName(names, minNameID=256) + # Because there is an inconsistency in the names, + # addMultilingualName adds a new name ID + self.assertEqual(271, nameID) + def test_decompile_badOffset(self): # https://github.com/fonttools/fonttools/issues/525 table = table__n_a_m_e() @@ -450,6 +461,103 @@ class NameRecordTest(unittest.TestCase): self.assertEqual(name.getEncoding(None), None) self.assertEqual(name.getEncoding(default=None), None) + def test_get_family_name(self): + name = table__n_a_m_e() + name.names = [ + makeName("Copyright", 0, 1, 0, 0), + makeName("Family Name ID 1", 1, 1, 0, 0), + makeName("SubFamily Name ID 2", 2, 1, 0, 0), + makeName("Unique Name ID 3", 3, 1, 0, 0), + makeName("Full Name ID 4", 4, 1, 0, 0), + makeName("PS Name ID 6", 6, 1, 0, 0), + makeName("Version Name ID 5", 5, 1, 0, 0), + makeName("Trademark Name ID 7", 7, 1, 0, 0), + ] + + result_value = name.getBestFamilyName() + self.assertEqual("Family Name ID 1", result_value) + + expected_value = "Family Name ID 16" + name.setName(expected_value, 16, 1, 0, 0) + result_value = name.getBestFamilyName() + self.assertEqual(expected_value, result_value) + + expected_value = "Family Name ID 21" + name.setName(expected_value, 21, 1, 0, 0) + result_value = name.getBestFamilyName() + self.assertEqual(expected_value, result_value) + + def test_get_subfamily_name(self): + name = table__n_a_m_e() + name.names = [ + makeName("Copyright", 0, 1, 0, 0), + makeName("Family Name ID 1", 1, 1, 0, 0), + makeName("SubFamily Name ID 2", 2, 1, 0, 0), + makeName("Unique Name ID 3", 3, 1, 0, 0), + makeName("Full Name ID 4", 4, 1, 0, 0), + makeName("PS Name ID 6", 6, 1, 0, 0), + makeName("Version Name ID 5", 5, 1, 0, 0), + makeName("Trademark Name ID 7", 7, 1, 0, 0), + ] + + result_value = name.getBestSubFamilyName() + self.assertEqual("SubFamily Name ID 2", result_value) + + expected_value = "Family Name ID 17" + name.setName(expected_value, 17, 1, 0, 0) + result_value = name.getBestSubFamilyName() + self.assertEqual(expected_value, result_value) + + expected_value = "Family Name ID 22" + name.setName(expected_value, 22, 1, 0, 0) + result_value = name.getBestSubFamilyName() + self.assertEqual(expected_value, result_value) + + def test_get_nice_full_name(self): + name = table__n_a_m_e() + name.names = [ + makeName("NID 1", 1, 1, 0, 0), + makeName("NID 2", 2, 1, 0, 0), + makeName("NID 4", 4, 1, 0, 0), + makeName("NID 6", 6, 1, 0, 0), + ] + + result_value = name.getBestFullName() + self.assertEqual("NID 1 NID 2", result_value) + + expected_value = "NID 1 NID 2" + # expection is still NID 1 NID 2, + # because name ID 17 is missing + name.setName("NID 16", 16, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual(expected_value, result_value) + + name.setName('NID 17', 17, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual("NID 16 NID 17", result_value) + + expected_value = "NID 16 NID 17" + # expection is still NID 16 NID 17, + # because name ID 21 is missing + name.setName('NID 21', 21, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual(expected_value, result_value) + + name.setName('NID 22', 22, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual("NID 21 NID 22", result_value) + + for NID in [2, 16, 17, 21, 22]: + name.removeNames(NID) + + result_value = name.getBestFullName() + self.assertEqual("NID 4", result_value) + + name.setName('Regular', 2, 1, 0, 0) + result_value = name.getBestFullName() + self.assertEqual("NID 1", result_value) + + if __name__ == "__main__": import sys sys.exit(unittest.main()) diff --git a/Tests/ttLib/tables/otTables_test.py b/Tests/ttLib/tables/otTables_test.py index 9202aa55..3f74b7a9 100644 --- a/Tests/ttLib/tables/otTables_test.py +++ b/Tests/ttLib/tables/otTables_test.py @@ -1,4 +1,4 @@ -from fontTools.misc.testTools import getXML, parseXML, FakeFont +from fontTools.misc.testTools import getXML, parseXML, parseXmlInto, FakeFont from fontTools.misc.textTools import deHexStr, hexStr from fontTools.misc.xmlWriter import XMLWriter from fontTools.ttLib.tables.otBase import OTTableReader, OTTableWriter @@ -512,8 +512,11 @@ class InsertionMorphActionTest(unittest.TestCase): for name, attrs, content in parseXML(self.MORPH_ACTION_XML): a.fromXML(name, attrs, content, self.font) writer = OTTableWriter() - a.compile(writer, self.font, - actionIndex={('B', 'C'): 9, ('B', 'A', 'D'): 7}) + a.compile( + writer, + self.font, + actionIndex={('B', 'C'): 9, ('B', 'A', 'D'): 7}, + ) self.assertEqual(hexStr(writer.getAllData()), "1234fc4300090007") def testCompileActions_empty(self): @@ -551,13 +554,11 @@ class SplitMultipleSubstTest: from fontTools.ttLib.tables.otBase import OverflowErrorRecord oldSubTable = buildMultipleSubstSubtable({'e': 1, 'a': 2, 'b': 3, 'c': 4, 'd': 5}) - oldSubTable.Format = 1 newSubTable = otTables.MultipleSubst() ok = otTables.splitMultipleSubst(oldSubTable, newSubTable, OverflowErrorRecord((None, None, None, itemName, itemRecord))) assert ok - assert oldSubTable.Format == newSubTable.Format return oldSubTable.mapping, newSubTable.mapping def test_Coverage(self): @@ -577,113 +578,142 @@ class SplitMultipleSubstTest: def test_splitMarkBasePos(): - from fontTools.otlLib.builder import buildAnchor, buildMarkBasePosSubtable - - marks = { - "acutecomb": (0, buildAnchor(0, 600)), - "gravecomb": (0, buildAnchor(0, 590)), - "cedillacomb": (1, buildAnchor(0, 0)), - } - bases = { - "a": { - 0: buildAnchor(350, 500), - 1: None, - }, - "c": { - 0: buildAnchor(300, 700), - 1: buildAnchor(300, 0), - }, - } - glyphOrder = ["a", "c", "acutecomb", "gravecomb", "cedillacomb"] - glyphMap = {g: i for i, g in enumerate(glyphOrder)} - - oldSubTable = buildMarkBasePosSubtable(marks, bases, glyphMap) - newSubTable = otTables.MarkBasePos() - - ok = otTables.splitMarkBasePos(oldSubTable, newSubTable, overflowRecord=None) - - assert ok - - assert getXML(oldSubTable.toXML) == [ - '', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - '', - ] - - assert getXML(newSubTable.toXML) == [ - '', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - ' ', - '', - ] + from fontTools.otlLib.builder import buildAnchor, buildMarkBasePosSubtable + + marks = { + "acutecomb": (0, buildAnchor(0, 600)), + "gravecomb": (0, buildAnchor(0, 590)), + "cedillacomb": (1, buildAnchor(0, 0)), + } + bases = { + "a": { + 0: buildAnchor(350, 500), + 1: None, + }, + "c": { + 0: buildAnchor(300, 700), + 1: buildAnchor(300, 0), + }, + } + glyphOrder = ["a", "c", "acutecomb", "gravecomb", "cedillacomb"] + glyphMap = {g: i for i, g in enumerate(glyphOrder)} + + oldSubTable = buildMarkBasePosSubtable(marks, bases, glyphMap) + newSubTable = otTables.MarkBasePos() + + ok = otTables.splitMarkBasePos(oldSubTable, newSubTable, overflowRecord=None) + + assert ok + + assert getXML(oldSubTable.toXML) == [ + '', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + '', + ] + + assert getXML(newSubTable.toXML) == [ + '', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + ' ', + '', + ] + + +class ColrV1Test(unittest.TestCase): + def setUp(self): + self.font = FakeFont(['.notdef', 'meh']) + + def test_traverseEmptyPaintColrLayersNeedsNoLayerList(self): + colr = parseXmlInto( + self.font, + otTables.COLR(), + ''' + + + + + + + + + + + ''', + ) + paint = colr.BaseGlyphList.BaseGlyphPaintRecord[0].Paint + + # Just want to confirm we don't crash + visited = [] + paint.traverse(colr, lambda p: visited.append(p)) + assert len(visited) == 1 if __name__ == "__main__": diff --git a/Tests/ttLib/tables/tables_test.py b/Tests/ttLib/tables/tables_test.py index f66323fb..be8c63e3 100644 --- a/Tests/ttLib/tables/tables_test.py +++ b/Tests/ttLib/tables/tables_test.py @@ -254,7 +254,7 @@ def read_expected_ttx(testfile, tableTag): def dump_ttx(font, tableTag): f = StringIO() - font.saveXML(f, newlinestr='\n', tables=[tableTag]) + font.saveXML(f, tables=[tableTag]) return ttLibVersion_RE.sub('', f.getvalue()) diff --git a/Tests/ttLib/tables/ttProgram_test.py b/Tests/ttLib/tables/ttProgram_test.py index be6e86a0..13d1ba87 100644 --- a/Tests/ttLib/tables/ttProgram_test.py +++ b/Tests/ttLib/tables/ttProgram_test.py @@ -104,7 +104,7 @@ class ProgramTest(unittest.TestCase): p.fromBytecode(BYTECODE) ttfont = TestFont() buf = StringIO() - writer = XMLWriter(buf, newlinestr='\n') + writer = XMLWriter(buf) try: p.toXML(writer, ttfont) finally: diff --git a/Tests/ttLib/ttCollection_test.py b/Tests/ttLib/ttCollection_test.py new file mode 100644 index 00000000..91a1117d --- /dev/null +++ b/Tests/ttLib/ttCollection_test.py @@ -0,0 +1,27 @@ +import os +from pathlib import Path +from fontTools.ttLib import TTCollection +import pytest + +TTX_DATA_DIR = Path(__file__).parent.parent / "ttx" / "data" + + +@pytest.fixture(params=[None, True, False]) +def lazy(request): + return request.param + + +def test_lazy_open_path(lazy): + ttc_path = TTX_DATA_DIR / "TestTTC.ttc" + with TTCollection(ttc_path, lazy=lazy) as collection: + assert len(collection) == 2 + assert collection[0]["maxp"].numGlyphs == 6 + assert collection[1]["maxp"].numGlyphs == 6 + + +def test_lazy_open_file(lazy): + with (TTX_DATA_DIR / "TestTTC.ttc").open("rb") as file: + collection = TTCollection(file, lazy=lazy) + assert len(collection) == 2 + assert collection[0]["maxp"].numGlyphs == 6 + assert collection[1]["maxp"].numGlyphs == 6 diff --git a/Tests/ttLib/ttFont_test.py b/Tests/ttLib/ttFont_test.py index 47cedeb7..e0e82b24 100644 --- a/Tests/ttLib/ttFont_test.py +++ b/Tests/ttLib/ttFont_test.py @@ -1,6 +1,15 @@ import io +import os +import re +import random +from fontTools.feaLib.builder import addOpenTypeFeaturesFromString from fontTools.ttLib import TTFont, newTable, registerCustomTableClass, unregisterCustomTableClass from fontTools.ttLib.tables.DefaultTable import DefaultTable +from fontTools.ttLib.tables._c_m_a_p import CmapSubtable +import pytest + + +DATA_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)), "data") class CustomTableClass(DefaultTable): @@ -20,6 +29,13 @@ table_C_U_S_T_ = CustomTableClass # alias for testing TABLETAG = "CUST" +def normalize_TTX(string): + string = re.sub(' ttLibVersion=".*"', "", string) + string = re.sub('checkSumAdjustment value=".*"', "", string) + string = re.sub('modified value=".*"', "", string) + return string + + def test_registerCustomTableClass(): font = TTFont() font[TABLETAG] = newTable(TABLETAG) @@ -46,3 +62,153 @@ def test_registerCustomTableClassStandardName(): assert font[TABLETAG].compile(font) == b"\x04\x05\x06" finally: unregisterCustomTableClass(TABLETAG) + + +ttxTTF = r""" + + + + + +""" + + +ttxOTF = """ + + + + + +""" + + +def test_sfntVersionFromTTX(): + # https://github.com/fonttools/fonttools/issues/2370 + font = TTFont() + assert font.sfntVersion == "\x00\x01\x00\x00" + ttx = io.StringIO(ttxOTF) + # Font is "empty", TTX file will determine sfntVersion + font.importXML(ttx) + assert font.sfntVersion == "OTTO" + ttx = io.StringIO(ttxTTF) + # Font is not "empty", sfntVersion in TTX file will be ignored + font.importXML(ttx) + assert font.sfntVersion == "OTTO" + + +def test_virtualGlyphId(): + otfpath = os.path.join(DATA_DIR, "TestVGID-Regular.otf") + ttxpath = os.path.join(DATA_DIR, "TestVGID-Regular.ttx") + + otf = TTFont(otfpath) + + ttx = TTFont() + ttx.importXML(ttxpath) + + with open(ttxpath, encoding="utf-8") as fp: + xml = normalize_TTX(fp.read()).splitlines() + + for font in (otf, ttx): + GSUB = font["GSUB"].table + assert GSUB.LookupList.LookupCount == 37 + lookup = GSUB.LookupList.Lookup[32] + assert lookup.LookupType == 8 + subtable = lookup.SubTable[0] + assert subtable.LookAheadGlyphCount == 1 + lookahead = subtable.LookAheadCoverage[0] + assert len(lookahead.glyphs) == 46 + assert "glyph00453" in lookahead.glyphs + + out = io.StringIO() + font.saveXML(out) + outxml = normalize_TTX(out.getvalue()).splitlines() + assert xml == outxml + + +def test_setGlyphOrder_also_updates_glyf_glyphOrder(): + # https://github.com/fonttools/fonttools/issues/2060#issuecomment-1063932428 + font = TTFont() + font.importXML(os.path.join(DATA_DIR, "TestTTF-Regular.ttx")) + current_order = font.getGlyphOrder() + + assert current_order == font["glyf"].glyphOrder + + new_order = list(current_order) + while new_order == current_order: + random.shuffle(new_order) + + font.setGlyphOrder(new_order) + + assert font.getGlyphOrder() == new_order + assert font["glyf"].glyphOrder == new_order + + +@pytest.mark.parametrize("lazy", [None, True, False]) +def test_ensureDecompiled(lazy): + # test that no matter the lazy value, ensureDecompiled decompiles all tables + font = TTFont() + font.importXML(os.path.join(DATA_DIR, "TestTTF-Regular.ttx")) + # test font has no OTL so we add some, as an example of otData-driven tables + addOpenTypeFeaturesFromString( + font, + """ + feature calt { + sub period' period' period' space by ellipsis; + } calt; + + feature dist { + pos period period -30; + } dist; + """ + ) + # also add an additional cmap subtable that will be lazily-loaded + cm = CmapSubtable.newSubtable(14) + cm.platformID = 0 + cm.platEncID = 5 + cm.language = 0 + cm.cmap = {} + cm.uvsDict = {0xFE00: [(0x002e, None)]} + font["cmap"].tables.append(cm) + + # save and reload, potentially lazily + buf = io.BytesIO() + font.save(buf) + buf.seek(0) + font = TTFont(buf, lazy=lazy) + + # check no table is loaded until/unless requested, no matter the laziness + for tag in font.keys(): + assert not font.isLoaded(tag) + + if lazy is not False: + # additional cmap doesn't get decompiled automatically unless lazy=False; + # can't use hasattr or else cmap's maginc __getattr__ kicks in... + cm = next(st for st in font["cmap"].tables if st.__dict__["format"] == 14) + assert cm.data is not None + assert "uvsDict" not in cm.__dict__ + # glyf glyphs are not expanded unless lazy=False + assert font["glyf"].glyphs["period"].data is not None + assert not hasattr(font["glyf"].glyphs["period"], "coordinates") + + if lazy is True: + # OTL tables hold a 'reader' to lazily load when lazy=True + assert "reader" in font["GSUB"].table.LookupList.__dict__ + assert "reader" in font["GPOS"].table.LookupList.__dict__ + + font.ensureDecompiled() + + # all tables are decompiled now + for tag in font.keys(): + assert font.isLoaded(tag) + # including the additional cmap + cm = next(st for st in font["cmap"].tables if st.__dict__["format"] == 14) + assert cm.data is None + assert "uvsDict" in cm.__dict__ + # expanded glyf glyphs lost the 'data' attribute + assert not hasattr(font["glyf"].glyphs["period"], "data") + assert hasattr(font["glyf"].glyphs["period"], "coordinates") + # and OTL tables have read their 'reader' + assert "reader" not in font["GSUB"].table.LookupList.__dict__ + assert "Lookup" in font["GSUB"].table.LookupList.__dict__ + assert "reader" not in font["GPOS"].table.LookupList.__dict__ + assert "Lookup" in font["GPOS"].table.LookupList.__dict__ diff --git a/Tests/ttLib/woff2_test.py b/Tests/ttLib/woff2_test.py index c0d60cee..7fe40dd1 100644 --- a/Tests/ttLib/woff2_test.py +++ b/Tests/ttLib/woff2_test.py @@ -1,4 +1,3 @@ -from fontTools.misc.py23 import Tag, bytechr, byteord from fontTools import ttLib from fontTools.ttLib import woff2 from fontTools.ttLib.tables import _g_l_y_f @@ -10,6 +9,7 @@ from fontTools.ttLib.woff2 import ( WOFF2HmtxTable, WOFF2Writer, unpackBase128, unpack255UShort, pack255UShort) import unittest from fontTools.misc import sstruct +from fontTools.misc.textTools import Tag, bytechr, byteord from fontTools import fontBuilder from fontTools.pens.ttGlyphPen import TTGlyphPen from io import BytesIO diff --git a/Tests/ttx/ttx_test.py b/Tests/ttx/ttx_test.py index c2463474..ef8d8789 100644 --- a/Tests/ttx/ttx_test.py +++ b/Tests/ttx/ttx_test.py @@ -436,12 +436,6 @@ def test_options_b(): tto = ttx.Options([("-b", "")], 1) assert tto.recalcBBoxes is False - -def test_options_a(): - tto = ttx.Options([("-a", "")], 1) - assert tto.allowVID is True - - def test_options_e(): tto = ttx.Options([("-e", "")], 1) assert tto.ignoreDecompileErrors is False @@ -967,10 +961,6 @@ def test_main_keyboard_interrupt(tmpdir, monkeypatch, caplog): assert "(Cancelled.)" in caplog.text -@pytest.mark.skipif( - sys.platform == "win32", - reason="waitForKeyPress function causes test to hang on Windows platform", -) def test_main_system_exit(tmpdir, monkeypatch): with pytest.raises(SystemExit): inpath = os.path.join("Tests", "ttx", "data", "TestTTF.ttx") @@ -997,10 +987,6 @@ def test_main_ttlib_error(tmpdir, monkeypatch, caplog): assert "Test error" in caplog.text -@pytest.mark.skipif( - sys.platform == "win32", - reason="waitForKeyPress function causes test to hang on Windows platform", -) def test_main_base_exception(tmpdir, monkeypatch, caplog): with pytest.raises(SystemExit): inpath = os.path.join("Tests", "ttx", "data", "TestTTF.ttx") diff --git a/Tests/ufoLib/UFOZ_test.py b/Tests/ufoLib/UFOZ_test.py index 51362106..6ea39e9a 100644 --- a/Tests/ufoLib/UFOZ_test.py +++ b/Tests/ufoLib/UFOZ_test.py @@ -1,7 +1,7 @@ -from fontTools.misc.py23 import tostr from fontTools.ufoLib import UFOReader, UFOWriter, UFOFileStructure from fontTools.ufoLib.errors import UFOLibError, GlifLibError from fontTools.misc import plistlib +from fontTools.misc.textTools import tostr import sys import os import fs.osfs diff --git a/Tests/ufoLib/filenames_test.py b/Tests/ufoLib/filenames_test.py index a9415a1c..bad41353 100644 --- a/Tests/ufoLib/filenames_test.py +++ b/Tests/ufoLib/filenames_test.py @@ -29,6 +29,16 @@ class TestFilenames(unittest.TestCase): self.assertEqual(userNameToFileName("con.alt"), "_con.alt") self.assertEqual(userNameToFileName("alt.con"), "alt._con") + self.assertEqual( + # Test output for ASCII range (up until 0x7F), except for illegal + # characters. + userNameToFileName("".join([chr(i) for i in range(0, 0x80)])), + "________________________________" + " !_#$%&'____,-._0123456789_;_=__" + "@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_" + "___^_`abcdefghijklmnopqrstuvwxyz{_}~_", + ) + def test_userNameToFileName_ValueError(self): with self.assertRaises(ValueError): userNameToFileName(b"a") diff --git a/Tests/ufoLib/glifLib_test.py b/Tests/ufoLib/glifLib_test.py index 3af0256c..485c2bd9 100644 --- a/Tests/ufoLib/glifLib_test.py +++ b/Tests/ufoLib/glifLib_test.py @@ -159,6 +159,8 @@ class FileNameTest: dst.writeGlyph("a", glyph) dst.writeGlyph("A", glyph) dst.writeGlyph("a_", glyph) + dst.deleteGlyph("a_") + dst.writeGlyph("a_", glyph) dst.writeGlyph("A_", glyph) dst.writeGlyph("i_j", glyph) diff --git a/Tests/unicodedata_test.py b/Tests/unicodedata_test.py index 05f7de68..5cdb3404 100644 --- a/Tests/unicodedata_test.py +++ b/Tests/unicodedata_test.py @@ -198,7 +198,7 @@ def test_block(): assert unicodedata.block("\x7F") == "Basic Latin" assert unicodedata.block("\x80") == "Latin-1 Supplement" assert unicodedata.block("\u1c90") == "Georgian Extended" - assert unicodedata.block("\u0870") == "No_Block" + assert unicodedata.block("\u0870") == "Arabic Extended-B" def test_ot_tags_from_script(): @@ -230,6 +230,9 @@ def test_ot_tag_to_script(): assert unicodedata.ot_tag_to_script("vai ") == "Vaii" assert unicodedata.ot_tag_to_script("lao ") == "Laoo" assert unicodedata.ot_tag_to_script("yi") == "Yiii" + # both 'hang' and 'jamo' tags map to the Hangul script + assert unicodedata.ot_tag_to_script("hang") == "Hang" + assert unicodedata.ot_tag_to_script("jamo") == "Hang" for invalid_value in ("", " ", "z zz", "zzzzz"): with pytest.raises(ValueError, match="invalid OpenType tag"): @@ -240,6 +243,7 @@ def test_script_horizontal_direction(): assert unicodedata.script_horizontal_direction("Latn") == "LTR" assert unicodedata.script_horizontal_direction("Arab") == "RTL" assert unicodedata.script_horizontal_direction("Thaa") == "RTL" + assert unicodedata.script_horizontal_direction("Ougr") == "RTL" with pytest.raises(KeyError): unicodedata.script_horizontal_direction("Azzz") diff --git a/Tests/varLib/builder_test.py b/Tests/varLib/builder_test.py index 80607eaa..6cad103a 100644 --- a/Tests/varLib/builder_test.py +++ b/Tests/varLib/builder_test.py @@ -8,12 +8,20 @@ import pytest ([0], [[128]], 1), ([0, 1, 2], [[128, 1, 2], [3, -129, 5], [6, 7, 8]], 2), ([0, 1, 2], [[0, 128, 2], [3, 4, 5], [6, 7, -129]], 3), + ([0], [[32768]], 0x8001), + ([0, 1, 2], [[32768, 1, 2], [3, -129, 5], [6, 7, 8]], 0x8001), + ([0, 1, 2], [[32768, 1, 2], [3, -32769, 5], [6, 7, 8]], 0x8002), + ([0, 1, 2], [[0, 32768, 2], [3, 4, 5], [6, 7, -32769]], 0x8003), ], ids=[ "0_regions_0_deltas", "1_region_1_uint8", "1_region_1_short", "3_regions_2_shorts_ordered", "3_regions_2_shorts_unordered", + "1_region_1_long", + "3_regions_1_long_ordered", + "3_regions_2_longs_ordered", + "3_regions_2_longs_unordered", ]) def test_buildVarData_no_optimize(region_indices, items, expected_num_shorts): data = buildVarData(region_indices, items, optimize=False) @@ -41,6 +49,16 @@ def test_buildVarData_no_optimize(region_indices, items, expected_num_shorts): [0, 1, 2], [[0, 1, 128], [3, -129, 5], [256, 7, 8]]), ([0, 1, 2], [[0, 128, 2], [0, 4, 5], [0, 7, 8]], 1, [1, 2], [[128, 2], [4, 5], [7, 8]]), + ([0, 1, 2], [[0, 32768, 2], [3, 4, 5], [6, 7, 8]], 0x8001, + [1, 0, 2], [[32768, 0, 2], [4, 3, 5], [7, 6, 8]]), + ([0, 1, 2], [[0, 1, 32768], [3, 4, 5], [6, -32769, 8]], 0x8002, + [1, 2, 0], [[1, 32768, 0], [4, 5, 3], [-32769, 8, 6]]), + ([0, 1, 2], [[32768, 1, -32769], [3, 4, 5], [6, 7, 8]], 0x8002, + [0, 2, 1], [[32768, -32769, 1], [3, 5, 4], [6, 8, 7]]), + ([0, 1, 2], [[0, 1, 32768], [3, -32769, 5], [65536, 7, 8]], 0x8003, + [0, 1, 2], [[0, 1, 32768], [3, -32769, 5], [65536, 7, 8]]), + ([0, 1, 2], [[0, 32768, 2], [0, 4, 5], [0, 7, 8]], 0x8001, + [1, 2], [[32768, 2], [4, 5], [7, 8]]), ], ids=[ "0/3_shorts_no_reorder", "1/3_shorts_reorder", @@ -48,6 +66,11 @@ def test_buildVarData_no_optimize(region_indices, items, expected_num_shorts): "2/3_shorts_same_row_reorder", "3/3_shorts_no_reorder", "1/3_shorts_1/3_zeroes", + "1/3_longs_reorder", + "2/3_longs_reorder", + "2/3_longs_same_row_reorder", + "3/3_longs_no_reorder", + "1/3_longs_1/3_zeroes", ]) def test_buildVarData_optimize( region_indices, items, expected_num_shorts, expected_regions, diff --git a/Tests/varLib/instancer/data/PartialInstancerTest4-VF.ttx b/Tests/varLib/instancer/data/PartialInstancerTest4-VF.ttx new file mode 100644 index 00000000..8d445b01 --- /dev/null +++ b/Tests/varLib/instancer/data/PartialInstancerTest4-VF.ttx @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Weight + + + Regular + + + Bold + + + New Font + + + Regular + + + 1.000;NONE;NewFont-Regular + + + New Font Regular + + + Version 1.000 + + + NewFont-Regular + + + Weight + + + Regular + + + Bold + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wght + 0x0 + 400.0 + 400.0 + 700.0 + 256 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/varLib/instancer/data/SinglePos.ttx b/Tests/varLib/instancer/data/SinglePos.ttx new file mode 100644 index 00000000..64ffd9f5 --- /dev/null +++ b/Tests/varLib/instancer/data/SinglePos.ttx @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Optical Size + + + Weight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + opsz + 0x0 + 17.0 + 18.0 + 18.0 + 256 + + + wght + 0x0 + 400.0 + 400.0 + 700.0 + 257 + + + + diff --git a/Tests/varLib/instancer/data/test_results/SinglePos-VF-instance-280,18.ttx b/Tests/varLib/instancer/data/test_results/SinglePos-VF-instance-280,18.ttx new file mode 100644 index 00000000..2c284ba0 --- /dev/null +++ b/Tests/varLib/instancer/data/test_results/SinglePos-VF-instance-280,18.ttx @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Optical Size + + + Weight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py index cb7e8547..bb2d1758 100644 --- a/Tests/varLib/instancer/instancer_test.py +++ b/Tests/varLib/instancer/instancer_test.py @@ -1,5 +1,5 @@ -from fontTools.misc.py23 import Tag from fontTools.misc.fixedTools import floatToFixedToFloat +from fontTools.misc.textTools import Tag from fontTools import ttLib from fontTools import designspaceLib from fontTools.feaLib.builder import addOpenTypeFeaturesFromString @@ -936,6 +936,30 @@ class InstantiateOTLTest(object): assert not hasattr(valueRec1, "XAdvDevice") assert valueRec1.XAdvance == v2 + def test_GPOS_ValueRecord_XAdvDevice_wtihout_XAdvance(self): + # Test VF contains a PairPos adjustment in which the default instance + # has no XAdvance but there are deltas in XAdvDevice (VariationIndex). + vf = ttLib.TTFont() + vf.importXML(os.path.join(TESTDATA, "PartialInstancerTest4-VF.ttx")) + pairPos = vf["GPOS"].table.LookupList.Lookup[0].SubTable[0] + assert pairPos.ValueFormat1 == 0x40 + valueRec1 = pairPos.PairSet[0].PairValueRecord[0].Value1 + assert not hasattr(valueRec1, "XAdvance") + assert valueRec1.XAdvDevice.DeltaFormat == 0x8000 + outer = valueRec1.XAdvDevice.StartSize + inner = valueRec1.XAdvDevice.EndSize + assert vf["GDEF"].table.VarStore.VarData[outer].Item[inner] == [-50] + + # check that MutatorMerger for ValueRecord doesn't raise AttributeError + # when XAdvDevice is present but there's no corresponding XAdvance. + instancer.instantiateOTL(vf, {"wght": 0.5}) + + pairPos = vf["GPOS"].table.LookupList.Lookup[0].SubTable[0] + assert pairPos.ValueFormat1 == 0x4 + valueRec1 = pairPos.PairSet[0].PairValueRecord[0].Value1 + assert not hasattr(valueRec1, "XAdvDevice") + assert valueRec1.XAdvance == -25 + class InstantiateAvarTest(object): @pytest.mark.parametrize("location", [{"wght": 0.0}, {"wdth": 0.0}]) @@ -1387,7 +1411,7 @@ def _dump_ttx(ttFont): tmp.seek(0) ttFont2 = ttLib.TTFont(tmp, recalcBBoxes=False, recalcTimestamp=False) s = StringIO() - ttFont2.saveXML(s, newlinestr="\n") + ttFont2.saveXML(s) return _strip_ttLibVersion(s.getvalue()) @@ -1452,6 +1476,23 @@ class InstantiateVariableFontTest(object): assert _dump_ttx(instance) == expected + def test_singlepos(self): + varfont = ttLib.TTFont(recalcTimestamp=False) + varfont.importXML(os.path.join(TESTDATA, "SinglePos.ttx")) + + location = {"wght": 280, "opsz": 18} + + instance = instancer.instantiateVariableFont( + varfont, location, + ) + + expected = _get_expected_instance_ttx( + "SinglePos", *location.values() + ) + + assert _dump_ttx(instance) == expected + + def _conditionSetAsDict(conditionSet, axisOrder): result = {} diff --git a/Tests/varLib/interpolate_layout_test.py b/Tests/varLib/interpolate_layout_test.py index d7134d79..18dc3a75 100644 --- a/Tests/varLib/interpolate_layout_test.py +++ b/Tests/varLib/interpolate_layout_test.py @@ -61,12 +61,11 @@ class InterpolateLayoutTest(unittest.TestCase): lines = [] with open(path, "r", encoding="utf-8") as ttx: for line in ttx.readlines(): - # Elide ttFont attributes because ttLibVersion may change, - # and use os-native line separators so we can run difflib. + # Elide ttFont attributes because ttLibVersion may change. if line.startswith("" + os.linesep) + lines.append("\n") else: - lines.append(line.rstrip() + os.linesep) + lines.append(line.rstrip() + "\n") return lines def expect_ttx(self, font, expected_ttx, tables): diff --git a/Tests/varLib/mutator_test.py b/Tests/varLib/mutator_test.py index abe5d027..03ad870f 100644 --- a/Tests/varLib/mutator_test.py +++ b/Tests/varLib/mutator_test.py @@ -59,12 +59,11 @@ class MutatorTest(unittest.TestCase): lines = [] with open(path, "r", encoding="utf-8") as ttx: for line in ttx.readlines(): - # Elide ttFont attributes because ttLibVersion may change, - # and use os-native line separators so we can run difflib. + # Elide ttFont attributes because ttLibVersion may change. if line.startswith("" + os.linesep) + lines.append("\n") else: - lines.append(line.rstrip() + os.linesep) + lines.append(line.rstrip() + "\n") return lines def expect_ttx(self, font, expected_ttx, tables): diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py index b8e7183b..484a2e22 100644 --- a/Tests/varLib/varLib_test.py +++ b/Tests/varLib/varLib_test.py @@ -84,12 +84,11 @@ class BuildTest(unittest.TestCase): lines = [] with open(path, "r", encoding="utf-8") as ttx: for line in ttx.readlines(): - # Elide ttFont attributes because ttLibVersion may change, - # and use os-native line separators so we can run difflib. + # Elide ttFont attributes because ttLibVersion may change. if line.startswith("" + os.linesep) + lines.append("\n") else: - lines.append(line.rstrip() + os.linesep) + lines.append(line.rstrip() + "\n") return lines def expect_ttx(self, font, expected_ttx, tables): diff --git a/Tests/varLib/varStore_test.py b/Tests/varLib/varStore_test.py new file mode 100644 index 00000000..a1bdd123 --- /dev/null +++ b/Tests/varLib/varStore_test.py @@ -0,0 +1,82 @@ +import pytest +from fontTools.varLib.models import VariationModel +from fontTools.varLib.varStore import OnlineVarStoreBuilder, VarStoreInstancer +from fontTools.ttLib import TTFont, newTable +from fontTools.ttLib.tables._f_v_a_r import Axis +from fontTools.ttLib.tables.otBase import OTTableReader, OTTableWriter +from fontTools.ttLib.tables.otTables import VarStore + + +@pytest.mark.parametrize( + "locations, masterValues", + [ + ( + [{}, {"a": 1}], + [ + [10, 20], + [100, 2000], + [100, 22000], + ], + ), + ( + [{}, {"a": 1}, {"b": 1}, {"a": 1, "b": 1}], + [ + [10, 20, 40, 60], + [100, 2000, 400, 6000], + [7100, 22000, 4000, 30000], + ], + ), + ( + [{}, {"a": 1}], + [ + [10, 20], + [42000, 100], + [100, 52000], + ], + ), + ( + [{}, {"a": 1}, {"b": 1}, {"a": 1, "b": 1}], + [ + [10, 20, 40, 60], + [40000, 42000, 400, 6000], + [100, 22000, 4000, 173000], + ], + ), + ], +) +def test_onlineVarStoreBuilder(locations, masterValues): + axisTags = sorted({k for loc in locations for k in loc}) + model = VariationModel(locations) + builder = OnlineVarStoreBuilder(axisTags) + builder.setModel(model) + varIdxs = [] + for masters in masterValues: + _, varIdx = builder.storeMasters(masters) + varIdxs.append(varIdx) + + varStore = builder.finish() + mapping = varStore.optimize() + varIdxs = [mapping[varIdx] for varIdx in varIdxs] + + dummyFont = TTFont() + writer = OTTableWriter() + varStore.compile(writer, dummyFont) + data = writer.getAllData() + reader = OTTableReader(data) + varStore = VarStore() + varStore.decompile(reader, dummyFont) + + fvarAxes = [buildAxis(axisTag) for axisTag in axisTags] + instancer = VarStoreInstancer(varStore, fvarAxes) + for masters, varIdx in zip(masterValues, varIdxs): + base, *rest = masters + for expectedValue, loc in zip(masters, locations): + instancer.setLocation(loc) + value = base + instancer[varIdx] + assert expectedValue == value + + +def buildAxis(axisTag): + axis = Axis() + axis.axisTag = axisTag + return axis diff --git a/mypy.ini b/mypy.ini index 7e37b03f..0a04cfb2 100644 --- a/mypy.ini +++ b/mypy.ini @@ -1,5 +1,5 @@ [mypy] -python_version = 3.6 +python_version = 3.7 files = Lib/fontTools/misc/plistlib follow_imports = silent ignore_missing_imports = True diff --git a/requirements.txt b/requirements.txt index 680ffbb5..d061b779 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,13 +1,14 @@ # we use the official Brotli module on CPython and the CFFI-based # extension 'brotlipy' on PyPy brotli==1.0.9; platform_python_implementation != "PyPy" -brotlipy==0.7.0; platform_python_implementation == "PyPy" -unicodedata2==13.0.0.post2; python_version < '3.9' and platform_python_implementation != "PyPy" -scipy==1.5.4; platform_python_implementation != "PyPy" +brotlicffi==1.0.9.2; platform_python_implementation == "PyPy" +unicodedata2==14.0.0; python_version < '3.11' +scipy==1.7.3; platform_python_implementation != "PyPy" munkres==1.1.4; platform_python_implementation == "PyPy" -zopfli==0.1.6 -fs==2.4.11 -skia-pathops==0.5.1.post1; platform_python_implementation != "PyPy" +zopfli==0.1.9 +fs==2.4.14 +skia-pathops==0.7.2; platform_python_implementation != "PyPy" # this is only required to run Tests/cu2qu/{ufo,cli}_test.py -ufoLib2==0.6.2 -pyobjc==6.2.2; sys_platform == "darwin" +ufoLib2==0.13.0 +pyobjc==8.1; sys_platform == "darwin" +freetype-py==2.2.0 diff --git a/setup.cfg b/setup.cfg index 230175c6..7c7fc00c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 4.22.0 +current_version = 4.31.2 commit = True tag = False tag_name = {new_version} @@ -52,3 +52,10 @@ filterwarnings = ignore:writePlist:DeprecationWarning:plistlib_test ignore:some_function:DeprecationWarning:fontTools.ufoLib.utils ignore::DeprecationWarning:fontTools.varLib.designspace + +[tool:interrogate] +ignore-semiprivate = true +ignore-private = true +ignore-nested-functions = true +ignore-regex = ^(from|to)XML$,^(de)?compile$ +ignore-module = true diff --git a/setup.py b/setup.py index d1c5a4f6..2f30ef4f 100755 --- a/setup.py +++ b/setup.py @@ -90,11 +90,9 @@ extras_require = { # of the Unicode Character Database instead of the built-in unicodedata # which varies between python versions and may be outdated. "unicode": [ - # the unicodedata2 extension module doesn't work on PyPy. - # Python 3.9 already has Unicode 13.0, so the backport is not needed. + # Python 3.11 already has Unicode 14.0, so the backport is not needed. ( - "unicodedata2 >= 13.0.0; " - "python_version < '3.9' and platform_python_implementation != 'PyPy'" + "unicodedata2 >= 14.0.0; python_version < '3.11'" ), ], # for graphite type tables in ttLib/tables (Silf, Glat, Gloc) @@ -441,7 +439,7 @@ if ext_modules: setup_params = dict( name="fonttools", - version="4.22.0", + version="4.31.2", description="Tools to manipulate font files", author="Just van Rossum", author_email="just@letterror.com", @@ -450,7 +448,7 @@ setup_params = dict( url="http://github.com/fonttools/fonttools", license="MIT", platforms=["Any"], - python_requires=">=3.6", + python_requires=">=3.7", long_description=long_description, package_dir={'': 'Lib'}, packages=find_packages("Lib"), diff --git a/tox.ini b/tox.ini index bcbeeedd..22b1de74 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] minversion = 3.0 -envlist = mypy, py3{6,7,8,9}-cov, htmlcov +envlist = mypy, py3{7,8,9}-cov, htmlcov skip_missing_interpreters=true [testenv] @@ -16,7 +16,7 @@ deps = pytest pytest-randomly -rrequirements.txt - !nolxml: lxml==4.6.1 + !nolxml: lxml==4.6.4 extras = ufo woff -- cgit v1.2.3