From e65181ecd7255758a2ec3a99289fdc847a03f5f2 Mon Sep 17 00:00:00 2001 From: oetiker Date: Sun, 10 Jun 2007 23:55:13 +0000 Subject: [PATCH] switched graphics library from arts to cairo+pango git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk@1102 a5681a0c-68f1-0310-ab6d-d61299d08faa --- program/acinclude.m4 | 4 +- program/configure.ac | 17 +- program/src/Makefile.am | 7 +- program/src/art_rgba_svp.c | 336 -- program/src/art_rgba_svp.h | 21 - program/src/rrd_afm.c | 324 -- program/src/rrd_afm.h | 69 - program/src/rrd_afm_data.c | 6298 -------------------------------- program/src/rrd_afm_data.h | 191 - program/src/rrd_gfx.c | 2933 +-------------- program/src/rrd_gfx.h | 158 +- program/src/rrd_graph.c | 973 +++-- program/src/rrd_graph.h | 10 +- program/src/rrd_graph_helper.c | 14 +- 14 files changed, 679 insertions(+), 10676 deletions(-) delete mode 100644 program/src/art_rgba_svp.c delete mode 100644 program/src/art_rgba_svp.h delete mode 100644 program/src/rrd_afm.c delete mode 100644 program/src/rrd_afm.h delete mode 100644 program/src/rrd_afm_data.c delete mode 100644 program/src/rrd_afm_data.h diff --git a/program/acinclude.m4 b/program/acinclude.m4 index b71fe8e8..38ee0c29 100644 --- a/program/acinclude.m4 +++ b/program/acinclude.m4 @@ -36,9 +36,9 @@ AC_DEFUN([EX_CHECK_ALL], LDFLAGS=${LDFLAGS}" "`$PKGCONFIG --libs-only-other $4` LIBS=${LIBS}" "`$PKGCONFIG --libs-only-l $4` dnl remove the cached value and test again - unset ac_cv_lib_$1_$2 + unset ac_cv_lib_`echo $1 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']`_$2 AC_CHECK_LIB($1,$2,[ - unset ac_cv_header_`echo $3 | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` + unset ac_cv_header_`echo $3 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']` AC_CHECK_HEADER($3,[EX_CHECK_STATE=YES],[]) ],[]) else diff --git a/program/configure.ac b/program/configure.ac index fab77f5d..db2f4975 100644 --- a/program/configure.ac +++ b/program/configure.ac @@ -275,9 +275,9 @@ dnl ----------------------------------- dnl How the vertical axis label is printed AC_ARG_VAR(RRDGRAPH_YLEGEND_ANGLE, - [Vertical label angle: 90.0 (default) or 270.0]) + [Vertical label angle: -90.0 (default) or 90.0]) AC_DEFINE_UNQUOTED(RRDGRAPH_YLEGEND_ANGLE,${RRDGRAPH_YLEGEND_ANGLE:-90.0}, - [Vertical label angle: 90.0 (default) or 270.0]) + [Vertical label angle: -90.0 (default) or 90.0]) AC_ARG_ENABLE(rrdcgi,[ --disable-rrdcgi disable building of rrdcgi], [],[enable_rrdcgi=yes]) @@ -289,7 +289,7 @@ AC_ARG_WITH(rrd-default-font, if test -d ${WINDIR:-nodir}/cour.ttf ; then RRD_DEFAULT_FONT=`cd $WINDIR;pwd`/cour.ttf else - RRD_DEFAULT_FONT='$(fontsdir)/$(fonts_DATA)' + RRD_DEFAULT_FONT='"DejaVu Sans Mono,Bitstream Vera Sans Mono,Mono"' fi ]) @@ -601,10 +601,13 @@ AM_CONDITIONAL(BUILD_RRDCGI,[test $enable_rrdcgi != no]) CORE_LIBS="$LIBS" -EX_CHECK_ALL(art_lgpl_2, art_vpath_add_point, libart_lgpl/libart.h, libart-2.0, 2.3.17, ftp://ftp.gnome.org/pub/GNOME/sources/libart_lgpl/2.3/, /usr/include/libart-2.0) -EX_CHECK_ALL(z, zlibVersion, zlib.h, zlib, 1.2.3, http://www.gzip.org/zlib/, "") -EX_CHECK_ALL(png, png_access_version_number, png.h, libpng, 1.2.10, http://prdownloads.sourceforge.net/libpng/, "") -EX_CHECK_ALL(freetype, FT_Init_FreeType, ft2build.h, freetype2, 2.1.10, http://prdownloads.sourceforge.net/freetype/, /usr/include/freetype2) +dnl EX_CHECK_ALL(z, zlibVersion, zlib.h, zlib, 1.2.3, http://www.gzip.org/zlib/, "") +dnl EX_CHECK_ALL(png, png_access_version_number, png.h, libpng, 1.2.10, http://prdownloads.sourceforge.net/libpng/, "") +dnl EX_CHECK_ALL(freetype, FT_Init_FreeType, ft2build.h, freetype2, 2.1.10, http://prdownloads.sourceforge.net/freetype/, /usr/include/freetype2) +dnl EX_CHECK_ALL(fontconfig, FcInit, fontconfig.h, fontconfig, 2.3.1, http://fontconfig.org/release/, /usr/include) +EX_CHECK_ALL(cairo, cairo_version, cairo.h, cairo-png, 1.4.6, http://cairographics.org/releases/, "") +dnl EX_CHECK_ALL(glib-2.0, glib_check_version, glib.h, glib-2.0, 2.12.12, ftp://ftp.gtk.org/pub/glib/2.12/, "") +EX_CHECK_ALL(pango-1.0, pango_version_check, pango/pango.h, pangocairo, 1.17, http://ftp.gnome.org/pub/GNOME/sources/pango/1.17, "") if test "$EX_CHECK_ALL_ERR" = "YES"; then AC_MSG_ERROR([Please fix the library issues listed above and try again.]) diff --git a/program/src/Makefile.am b/program/src/Makefile.am index 56ffbb2a..77d9245e 100644 --- a/program/src/Makefile.am +++ b/program/src/Makefile.am @@ -11,8 +11,6 @@ if STATIC_PROGRAMS AM_LDFLAGS = -all-static endif -#INCLUDES = $(FREETYPE_INCLUDES) $(ART_INCLUDES) \ -# $(PNG_INCLUDES) $(ZLIB_INCLUDES) RRD_DEFAULT_FONT=@RRD_DEFAULT_FONT@ AM_CPPFLAGS = -DRRD_DEFAULT_FONT=\"$(RRD_DEFAULT_FONT)\" -DNUMVERS=@NUMVERS@ @@ -42,9 +40,7 @@ RRD_C_FILES = \ rrd_first.c \ rrd_restore.c \ rrd_xport.c \ - art_rgba_svp.c \ rrd_gfx.c \ - rrd_afm.c rrd_afm_data.c \ rrd_dump.c \ rrd_fetch.c \ rrd_tool.c \ @@ -52,12 +48,11 @@ RRD_C_FILES = \ rrd_tune.c noinst_HEADERS = \ - art_rgba_svp.h \ unused.h \ rrd_gfx.h \ rrd_getopt.h parsetime.h \ rrd_format.h rrd_tool.h rrd_xport.h rrd.h rrd_hw.h rrd_rpncalc.h \ - rrd_nan_inf.h fnv.h rrd_graph.h rrd_afm.h rrd_afm_data.h \ + rrd_nan_inf.h fnv.h rrd_graph.h \ rrd_is_thread_safe.h noinst_LTLIBRARIES = librrdupd.la diff --git a/program/src/art_rgba_svp.c b/program/src/art_rgba_svp.c deleted file mode 100644 index 1cb96a60..00000000 --- a/program/src/art_rgba_svp.c +++ /dev/null @@ -1,336 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * art_rgba_svp.c: A slightly modified version of art_rgb_svp to render into rgba buffer - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public License - * as published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Authors: - * Raph Levien - * Lauris Kaplinski - * - * Copyright (C) 1998 Raph Levien - * - */ - -#define SP_ART_RGBA_SVP_C - -/* Render a sorted vector path into an RGBA buffer. */ - -#include -#include -#include -#include - -#include "art_rgba_svp.h" -#include "unused.h" - -static void art_rgba_fill_run( - art_u8 * linebuf, - art_u8 r, - art_u8 g, - art_u8 b, - int n); -static void art_rgba_run_alpha( - art_u8 * linebuf, - art_u8 r, - art_u8 g, - art_u8 b, - int alpha, - int n); - -typedef struct _ArtRgbaSVPAlphaData ArtRgbaSVPAlphaData; - -struct _ArtRgbaSVPAlphaData { - int alphatab[256]; - art_u8 r, g, b, alpha; - art_u8 *buf; - int rowstride; - int libart_x0, libart_x1; -}; - -static void art_rgba_svp_alpha_callback( - void *callback_data, - int UNUSED(y), - int start, - ArtSVPRenderAAStep * steps, - int n_steps) -{ - ArtRgbaSVPAlphaData *data = callback_data; - art_u8 *linebuf; - int run_x0, run_x1; - art_u32 running_sum = start; - int libart_x0, libart_x1; - int k; - art_u8 r, g, b; - int *alphatab; - int alpha; - - linebuf = data->buf; - libart_x0 = data->libart_x0; - libart_x1 = data->libart_x1; - - r = data->r; - g = data->g; - b = data->b; - alphatab = data->alphatab; - - if (n_steps > 0) { - run_x1 = steps[0].x; - if (run_x1 > libart_x0) { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha(linebuf, - r, g, b, alphatab[alpha], - run_x1 - libart_x0); - } - - /* render the steps into tmpbuf */ - for (k = 0; k < n_steps - 1; k++) { - running_sum += steps[k].delta; - run_x0 = run_x1; - run_x1 = steps[k + 1].x; - if (run_x1 > run_x0) { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha(linebuf + (run_x0 - libart_x0) * 4, - r, g, b, alphatab[alpha], - run_x1 - run_x0); - } - } - running_sum += steps[k].delta; - if (libart_x1 > run_x1) { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha(linebuf + (run_x1 - libart_x0) * 4, - r, g, b, alphatab[alpha], - libart_x1 - run_x1); - } - } else { - alpha = (running_sum >> 16) & 0xff; - if (alpha) - art_rgba_run_alpha(linebuf, - r, g, b, alphatab[alpha], - libart_x1 - libart_x0); - } - - data->buf += data->rowstride; -} - -static void art_rgba_svp_alpha_opaque_callback( - void *callback_data, - int UNUSED(y), - int start, - ArtSVPRenderAAStep * steps, - int n_steps) -{ - ArtRgbaSVPAlphaData *data = callback_data; - art_u8 *linebuf; - int run_x0, run_x1; - art_u32 running_sum = start; - int libart_x0, libart_x1; - int k; - art_u8 r, g, b; - int *alphatab; - int alpha; - - linebuf = data->buf; - libart_x0 = data->libart_x0; - libart_x1 = data->libart_x1; - - r = data->r; - g = data->g; - b = data->b; - alphatab = data->alphatab; - - if (n_steps > 0) { - run_x1 = steps[0].x; - if (run_x1 > libart_x0) { - alpha = running_sum >> 16; - if (alpha) { - if (alpha >= 255) - art_rgba_fill_run(linebuf, r, g, b, run_x1 - libart_x0); - else - art_rgba_run_alpha(linebuf, - r, g, b, alphatab[alpha], - run_x1 - libart_x0); - } - } - - /* render the steps into tmpbuf */ - for (k = 0; k < n_steps - 1; k++) { - running_sum += steps[k].delta; - run_x0 = run_x1; - run_x1 = steps[k + 1].x; - if (run_x1 > run_x0) { - alpha = running_sum >> 16; - if (alpha) { - if (alpha >= 255) - art_rgba_fill_run(linebuf + (run_x0 - libart_x0) * 4, - r, g, b, run_x1 - run_x0); - else - art_rgba_run_alpha(linebuf + (run_x0 - libart_x0) * 4, - r, g, b, alphatab[alpha], - run_x1 - run_x0); - } - } - } - running_sum += steps[k].delta; - if (libart_x1 > run_x1) { - alpha = running_sum >> 16; - if (alpha) { - if (alpha >= 255) - art_rgba_fill_run(linebuf + (run_x1 - libart_x0) * 4, - r, g, b, libart_x1 - run_x1); - else - art_rgba_run_alpha(linebuf + (run_x1 - libart_x0) * 4, - r, g, b, alphatab[alpha], - libart_x1 - run_x1); - } - } - } else { - alpha = running_sum >> 16; - if (alpha) { - if (alpha >= 255) - art_rgba_fill_run(linebuf, r, g, b, libart_x1 - libart_x0); - else - art_rgba_run_alpha(linebuf, - r, g, b, alphatab[alpha], - libart_x1 - libart_x0); - } - } - - data->buf += data->rowstride; -} - -/** - * gnome_print_art_rgba_svp_alpha: Alpha-composite sorted vector path over RGBA buffer. - * @svp: The source sorted vector path. - * @libart_x0: Left coordinate of destination rectangle. - * @libart_y0: Top coordinate of destination rectangle. - * @libart_x1: Right coordinate of destination rectangle. - * @libart_y1: Bottom coordinate of destination rectangle. - * @rgba: Color in 0xRRGGBBAA format. - * @buf: Destination RGB buffer. - * @rowstride: Rowstride of @buf buffer. - * @alphagamma: #ArtAlphaGamma for gamma-correcting the compositing. - * - * Renders the shape specified with @svp over the @buf RGB buffer. - * @libart_x1 - @x0 specifies the width, and @libart_y1 - @libart_y0 specifies the height, - * of the rectangle rendered. The new pixels are stored starting at - * the first byte of @buf. Thus, the @x0 and @libart_y0 parameters specify - * an offset within @svp, and may be tweaked as a way of doing - * integer-pixel translations without fiddling with @svp itself. - * - * The @rgba argument specifies the color for the rendering. Pixels of - * entirely 0 winding number are left untouched. Pixels of entirely - * 1 winding number have the color @rgba composited over them (ie, - * are replaced by the red, green, blue components of @rgba if the alpha - * component is 0xff). Pixels of intermediate coverage are interpolated - * according to the rule in @alphagamma, or default to linear if - * @alphagamma is NULL. - **/ -void gnome_print_art_rgba_svp_alpha( - const ArtSVP * svp, - int libart_x0, - int libart_y0, - int libart_x1, - int libart_y1, - art_u32 rgba, - art_u8 * buf, - int rowstride, - ArtAlphaGamma UNUSED(*alphagamma)) -{ - ArtRgbaSVPAlphaData data; - int r, g, b, alpha; - int i; - int a, da; - - r = rgba >> 24; - g = (rgba >> 16) & 0xff; - b = (rgba >> 8) & 0xff; - alpha = rgba & 0xff; - - data.r = r; - data.g = g; - data.b = b; - data.alpha = alpha; - - a = 0x8000; - da = (alpha * 66051 + 0x80) >> 8; /* 66051 equals 2 ^ 32 / (255 * 255) */ - - for (i = 0; i < 256; i++) { - data.alphatab[i] = a >> 16; - a += da; - } - - data.buf = buf; - data.rowstride = rowstride; - data.libart_x0 = libart_x0; - data.libart_x1 = libart_x1; - if (alpha == 255) - art_svp_render_aa(svp, libart_x0, libart_y0, libart_x1, libart_y1, - art_rgba_svp_alpha_opaque_callback, &data); - else - art_svp_render_aa(svp, libart_x0, libart_y0, libart_x1, libart_y1, - art_rgba_svp_alpha_callback, &data); -} - -static void art_rgba_fill_run( - art_u8 * buf, - art_u8 r, - art_u8 g, - art_u8 b, - int n) -{ - int i; - - for (i = 0; i < n; i++) { - *buf++ = r; - *buf++ = g; - *buf++ = b; - *buf++ = 255; - } -} - -/* fixme: this */ - -static void art_rgba_run_alpha( - art_u8 * buf, - art_u8 r, - art_u8 g, - art_u8 b, - int alpha, - int n) -{ - int i; - int br, bg, bb, ba; - int cr, cg, cb; - - for (i = 0; i < n; i++) { - br = *(buf + 0); - bg = *(buf + 1); - bb = *(buf + 2); - ba = *(buf + 3); - - cr = (br * ba + 0x80) >> 8; - cg = (bg * ba + 0x80) >> 8; - cb = (bb * ba + 0x80) >> 8; - - *buf++ = cr + (((r - cr) * alpha + 0x80) >> 8); - *buf++ = cg + (((g - cg) * alpha + 0x80) >> 8); - *buf++ = cb + (((b - cb) * alpha + 0x80) >> 8); - *buf++ = ba + (((255 - ba) * alpha + 0x80) >> 8); - } -} diff --git a/program/src/art_rgba_svp.h b/program/src/art_rgba_svp.h deleted file mode 100644 index 406cced8..00000000 --- a/program/src/art_rgba_svp.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef SP_ART_RGBA_SVP_H -#define SP_ART_RGBA_SVP_H - -#include -#include -#include -#include -#include - -void gnome_print_art_rgba_svp_alpha( - const ArtSVP * svp, - int x0, - int y0, - int x1, - int y1, - art_u32 rgba, - art_u8 * buf, - int rowstride, - ArtAlphaGamma * alphagamma); - -#endif /* SP_ART_RGBA_SVP_H */ diff --git a/program/src/rrd_afm.c b/program/src/rrd_afm.c deleted file mode 100644 index a6cdd40d..00000000 --- a/program/src/rrd_afm.c +++ /dev/null @@ -1,324 +0,0 @@ -/**************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 - **************************************************************************** - * rrd_afm.h Parsing afm tables to find width of strings. - **************************************************************************** - * $Id$ -*/ - -#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) && !defined(HAVE_CONFIG_H) -#include "../win32/config.h" -#else -#ifdef HAVE_CONFIG_H -#include "../rrd_config.h" -#endif -#endif - -#include "rrd_afm.h" -#include "rrd_afm_data.h" - -#include - -#ifdef HAVE_STRING_H -#include -#endif - -#include "unused.h" - -#if 0 -# define DEBUG 1 -# define DLOG(x) fprintf x -#else -# define DEBUG 0 -# define DLOG(x) -#endif - -/* Adobe SVG View and Batik 1.1.1 can't handle ligatures. - So disable it as we just waste speed. - Besides, it doesn't matter much in normal text. -*/ -#define ENABLE_LIGATURES 0 - -static const afm_fontinfo *afm_last_used_font = NULL; -static const char *last_unknown_font = NULL; - -#define is_font(p, name) \ - (!strcmp(p->postscript_name, name) || !strcmp(p->fullname, name)) - -static const afm_fontinfo *afm_searchfont( - const char *name) -{ - int i; - const afm_fontinfo *p = afm_last_used_font; - - if (p && is_font(p, name)) - return p; - p = afm_fontinfolist; - for (i = 0; i < afm_fontinfo_count; i++, p++) { - if (is_font(p, name)) { - afm_last_used_font = p; - return p; - } - } - return NULL; -} - - -/* returns always a font, never NULL. - The rest of the code depends on the result never being NULL. - See rrd_afm.h */ -static const afm_fontinfo *afm_findfont( - const char *name) -{ - const afm_fontinfo *p = afm_searchfont(name); - - if (p) - return p; - if (!last_unknown_font || strcmp(name, last_unknown_font)) { - fprintf(stderr, "Can't find font '%s'\n", name); - last_unknown_font = name; - } - p = afm_searchfont(RRD_AFM_DEFAULT_FONT); - if (p) - return p; - return afm_fontinfolist; /* anything, just anything. */ -} - -const char *afm_get_font_postscript_name( - const char *font) -{ - const afm_fontinfo *p = afm_findfont(font); - - return p->postscript_name; -} - -const char *afm_get_font_name( - const char *font) -{ - const afm_fontinfo *p = afm_findfont(font); - - return p->fullname; -} - -double afm_get_ascender( - const char *font, - double size) -{ - const afm_fontinfo *p = afm_findfont(font); - - return size * p->ascender / 1000.0; -} - -double afm_get_descender( - const char *font, - double size) -{ - const afm_fontinfo *p = afm_findfont(font); - - return size * p->descender / 1000.0; -} - -static int afm_find_char_index( - const afm_fontinfo *fontinfo, - afm_cunicode ch1) -{ - int idx = ch1 - 32; - afm_cuint16 *indexP; - int numIndexChars, i; - - if (idx <= 0) - return 0; - if (idx <= 126 - 32) - return idx; - indexP = fontinfo->highchars_index; - if (indexP == 0) - return 0; - numIndexChars = fontinfo->highchars_count; - DLOG((stderr, " find highbit, num = %d\n", numIndexChars)); - if (ch1 >= 161 && ch1 <= 255) { - idx = ch1 - 161; - DLOG((stderr, " 161, idx = %d -> %d\n", idx, indexP[idx])); - if (idx < numIndexChars && indexP[idx] == ch1) { - idx += 127 - 32; - DLOG((stderr, " 161-guessed ok to %d\n", idx)); - return idx; - } - } - for (i = 0; i < numIndexChars; i++) { - DLOG((stderr, " compares to %d -> %d\n", indexP[i], i)); - if (indexP[i] == ch1) - return i + 127 - 32; - } - DLOG((stderr, "Did not find %d in highchars_index ??\n", ch1)); - return 0; -} - -#if ENABLE_LIGATURES -static afm_cunicode afm_find_combined_ligature( - const afm_fontinfo *fontinfo, - afm_cunicode ch1, - afm_cunicode ch2) -{ - afm_cunicode *p = fontinfo->ligatures; - int num = fontinfo->ligatures_count; - int i; - - if (!num) - return 0; - DLOG((stderr, " find-lig, num = %d\n", num)); - for (i = 0; i < num; i++, p += 3) { - DLOG((stderr, " lig: %d + %d -> %d (%c %c %c)\n", - p[0], p[1], p[2], p[0], p[1], p[2])); - if (ch1 == *p && ch2 == p[1]) { - DLOG((stderr, " matches.\n")); - return p[2]; - } - } - return 0; -} -#endif - -#define READ_ESCAPED(p, val) \ - if ((val = *p++) == 0) { \ - val = 254 + *p++; \ - } else if (!--val) { \ - val = *p++ << 8; \ - val |= *p++; \ - } - - -static long afm_find_kern( - const afm_fontinfo *fontinfo, - int kern_idx, - afm_cunicode ch2) -{ - afm_cuint8 *p8 = fontinfo->kerning_data + kern_idx; - int num; - - READ_ESCAPED(p8, num); - DLOG((stderr, " find kern, num pairs = %d\n", num)); - while (num > 0) { - afm_unicode ch; - - READ_ESCAPED(p8, ch); - DLOG((stderr, " pair-char = %d\n", ch)); - if (ch == ch2) { - DLOG((stderr, " got kern = %d\n", *(afm_csint8 *) p8)); - return *(afm_csint8 *) p8; - } - p8++; - num--; - } - return 0; -} - -/* measure width of a text string */ -double afm_get_text_width( - double start, - const char *font, - double size, - double tabwidth, - const char *text) -{ -#ifdef HAVE_MBSTOWCS - size_t clen = strlen(text) + 1; - wchar_t *cstr = malloc(sizeof(wchar_t) * clen); /* yes we are allocating probably too much here, I know */ - int text_count = mbstowcs(cstr, text, clen); - double w; - - if (text_count == -1) - text_count = mbstowcs(cstr, "Enc-Err", 6); -#ifdef __APPLE__ - while (text_count > 0) { - text_count--; - cstr[text_count] = afm_fix_osx_charset(cstr[text_count]); /* unsafe macro */ - } -#endif - w = afm_get_text_width_wide(start, font, size, tabwidth, cstr); - free(cstr); - return w; -#else - return afm_get_text_width_wide(start, font, size, tabwidth, text); -#endif -} - -double afm_get_text_width_wide( - double UNUSED(start), - const char *font, - double size, - double UNUSED(tabwidth), - const afm_char * text) -{ - const afm_fontinfo *fontinfo = afm_findfont(font); - long width = 0; - double widthf; - const afm_char *up = text; - - DLOG((stderr, "================= %s\n", text)); - if (fontinfo == NULL) { - while (*up) - up++; - return size * (up - text); - } - while (1) { - afm_unicode ch1, ch2; - int idx1, kern_idx; - - if ((ch1 = *up) == 0) - break; - ch2 = *++up; - DLOG((stderr, "------------- Loop: %d + %d (%c%c) at %d\n", - ch1, ch2, ch1, ch2 ? ch2 : ' ', - (up - (const unsigned char *) text) - 1)); - idx1 = afm_find_char_index(fontinfo, ch1); - DLOG((stderr, " idx1 = %d\n", idx1)); -#if ENABLE_LIGATURES - if (ch2) { - int ch1_new = - afm_find_combined_ligature(fontinfo, ch1, ch2); - - DLOG((stderr, " lig-ch = %d\n", ch1_new)); - if (ch1_new) { - ch1 = ch1_new; - idx1 = afm_find_char_index(fontinfo, ch1); - ch2 = *++up; - DLOG((stderr, " -> idx1 = %d, ch2 = %d (%c)\n", - idx1, ch2, ch2 ? ch2 : ' ')); - } - } -#endif - width += fontinfo->widths[idx1]; - DLOG((stderr, "Plain width of %d = %d\n", ch1, - fontinfo->widths[idx1])); - if (fontinfo->kerning_index && ch2) { - kern_idx = fontinfo->kerning_index[idx1]; - DLOG((stderr, " kern_idx = %d\n", kern_idx)); - if (kern_idx > 0) - width += afm_find_kern(fontinfo, kern_idx, ch2); - } - } - widthf = (width * 6 / 1000.0) * size; - DLOG((stderr, "Returns %ld (%ld) -> %f\n", width, width * 6, widthf)); - return widthf; -} - -#ifdef __APPLE__ -const unsigned char afm_mac2iso[128] = { - '\xC4', '\xC5', '\xC7', '\xC9', '\xD1', '\xD6', '\xDC', '\xE1', /* 80 */ - '\xE0', '\xE2', '\xE4', '\xE3', '\xE5', '\xE7', '\xE9', '\xE8', /* 88 */ - '\xEA', '\xEB', '\xED', '\xEC', '\xEE', '\xEF', '\xF1', '\xF3', /* 90 */ - '\xF2', '\xF4', '\xF6', '\xF5', '\xFA', '\xF9', '\xFB', '\xFC', /* 98 */ - '\xDD', '\xB0', '\xA2', '\xA3', '\xA7', ' ', '\xB6', '\xDF', /* A0 */ - '\xAE', '\xA9', ' ', '\xB4', '\xA8', ' ', '\xC6', '\xD8', /* A8 */ - ' ', '\xB1', '\xBE', ' ', '\xA5', '\xB5', ' ', ' ', /* B0 */ - '\xBD', '\xBC', ' ', '\xAA', '\xBA', ' ', '\xE6', '\xF8', /* B8 */ - '\xBF', '\xA1', '\xAC', ' ', ' ', ' ', ' ', '\xAB', /* C0 */ - '\xBB', ' ', '\xA0', '\xC0', '\xC3', '\xD5', ' ', '\xA6', /* C8 */ - '\xAD', ' ', '"', '"', '\'', '\'', '\xF7', '\xD7', /* D0 */ - '\xFF', ' ', ' ', '\xA4', '\xD0', '\xF0', '\xDE', '\xFE', /* D8 */ - '\xFD', '\xB7', ' ', ' ', ' ', '\xC2', '\xCA', '\xC1', /* E0 */ - '\xCB', '\xC8', '\xCD', '\xCE', '\xCF', '\xCC', '\xD3', '\xD4', /* E8 */ - ' ', '\xD2', '\xDA', '\xDB', '\xD9', ' ', ' ', ' ', /* F0 */ - '\xAF', ' ', ' ', ' ', '\xB8', ' ', ' ', ' ', /* F8 */ -}; -#endif diff --git a/program/src/rrd_afm.h b/program/src/rrd_afm.h deleted file mode 100644 index e333cbfb..00000000 --- a/program/src/rrd_afm.h +++ /dev/null @@ -1,69 +0,0 @@ -/**************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 - **************************************************************************** - * rrd_afm.h Parsing afm tables to find width of strings. - ****************************************************************************/ - -#ifndef RRD_AFM_H -#define RRD_AFM_H - -#include - -#ifdef HAVE_MBSTOWCS -#define afm_char wchar_t -#else -#define afm_char unsigned char -#endif -/* - If the font specified by the name parameter in the routes below - is not found - (because it is not compiled into rrd_afm_data.c by compile_afm.pl) - the font specified by RRD_AFM_DEFAULT_FONT will be used. - If it is not installed, it uses the first font compiled - into rrd_afm_data.c - So they will always use some font. -*/ - -#define RRD_AFM_DEFAULT_FONT "Courier" - -/* measure width of a text string */ -/* fontname can be full name or postscript name */ -double afm_get_text_width( - double start, - const char *font, - double size, - double tabwidth, - const char *text); -double afm_get_text_width_wide( - double start, - const char *font, - double size, - double tabwidth, - const afm_char * text); - -double afm_get_ascender( - const char *font, - double size); -double afm_get_descender( - const char *font, - double size); - -/* get postscript name from fullname or postscript name */ -const char *afm_get_font_postscript_name( - const char *font); -const char *afm_get_font_name( - const char *font); - -/* cc -E -dM /dev/null */ -#ifdef __APPLE__ -/* need charset conversion from macintosh to unicode. */ -extern const unsigned char afm_mac2iso[128]; - -#define afm_fix_osx_charset(c) \ - ( (c) >= 128 && (c) <= 255 ? afm_mac2iso[(c) - 128] : (c)) -#else -/* UNSAFE macro */ -#define afm_fix_osx_charset(x) (x) -#endif - -#endif diff --git a/program/src/rrd_afm_data.c b/program/src/rrd_afm_data.c deleted file mode 100644 index c9221635..00000000 --- a/program/src/rrd_afm_data.c +++ /dev/null @@ -1,6298 +0,0 @@ -/**************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 - **************************************************************************** - * rrd_afm_data.c Encoded afm (Adobe Font Metrics) for selected fonts. - **************************************************************************** - * - * THIS FILE IS AUTOGENERATED BY PERL. DO NOT EDIT. - * - ****************************************************************************/ - -#include "rrd_afm_data.h" -#include - - - -/* ------------------------------------------------------------------*/ -/* FontName: Courier */ -/* FullName: Courier */ -/* FamilyName: Courier */ -static afm_cuint8 afm_Courier_widths[] = { /* 315 */ - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 -}; -static afm_cuint16 afm_Courier_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Courier_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Courier-Bold */ -/* FullName: Courier Bold */ -/* FamilyName: Courier */ -static afm_cuint8 afm_Courier_Bold_widths[] = { /* 315 */ - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 -}; -static afm_cuint16 afm_Courier_Bold_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Courier_Bold_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Courier-BoldOblique */ -/* FullName: Courier Bold Oblique */ -/* FamilyName: Courier */ -static afm_cuint8 afm_Courier_BoldOblique_widths[] = { /* 315 */ - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 -}; -static afm_cuint16 afm_Courier_BoldOblique_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Courier_BoldOblique_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Courier-Oblique */ -/* FullName: Courier Oblique */ -/* FamilyName: Courier */ -static afm_cuint8 afm_Courier_Oblique_widths[] = { /* 315 */ - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, - 100, - 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 -}; -static afm_cuint16 afm_Courier_Oblique_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Courier_Oblique_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Helvetica */ -/* FullName: Helvetica */ -/* FamilyName: Helvetica */ -static afm_cuint8 afm_Helvetica_widths[] = { /* 315 */ - 46, 46, 59, 93, 93, 148, 111, 32, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93, - 93, 93, 93, - 93, 93, 93, 93, 93, 46, 46, 97, 97, 97, 93, 169, 111, 111, 120, 120, 111, - 102, 130, - 120, 46, 83, 111, 93, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111, - 157, 111, - 111, 102, 46, 46, 46, 78, 93, 56, 93, 93, 83, 93, 93, 46, 93, 93, 37, 37, - 83, 37, 139, - 93, 93, 93, 93, 56, 83, 46, 93, 83, 120, 83, 83, 83, 56, 43, 56, 97, 56, - 93, 93, 93, - 93, 43, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56, 93, 90, 46, - 56, 56, 61, - 93, 139, 139, 139, 102, 111, 111, 111, 111, 111, 111, 167, 120, 111, 111, - 111, 111, - 46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130, 120, 120, 120, - 120, 111, - 111, 102, 93, 93, 93, 93, 93, 93, 148, 83, 93, 93, 93, 93, 46, 46, 46, 46, - 93, 93, 93, - 93, 93, 93, 93, 97, 102, 93, 93, 93, 93, 83, 93, 83, 111, 93, 111, 93, - 111, 93, 120, - 83, 120, 83, 120, 107, 120, 93, 111, 93, 111, 93, 111, 93, 111, 93, 130, - 93, 130, - 93, 46, 46, 46, 37, 46, 46, 111, 83, 93, 37, 93, 37, 93, 50, 93, 37, 120, - 93, 120, 93, - 120, 93, 130, 93, 130, 93, 167, 157, 120, 56, 120, 56, 120, 56, 111, 83, - 111, 83, - 111, 83, 102, 46, 102, 53, 120, 93, 120, 93, 120, 93, 120, 93, 111, 102, - 83, 102, - 83, 102, 83, 93, 111, 83, 56, 56, 56, 56, 56, 56, 56, 56, 93, 167, 37, 37, - 37, 56, 56, - 56, 93, 93, 58, 167, 167, 56, 56, 28, 93, 167, 79, 102, 100, 97, 76, 92, - 92, 92, 79, - 42, 83, 83 -}; -static afm_sint16 afm_Helvetica_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 49, 52, 0, 0, - 0, 0, 0, 55, 170, 197, 202, 0, 241, 0, 0, 0, 345, 418, 510, 0, 0, 545, - 594, 687, 710, - 772, 777, 938, 966, 1115, 0, 1259, 0, 0, 0, 0, 0, 0, 0, 1407, 1419, 1468, - 0, 1476, - 1494, 1575, 1587, 0, 0, 1595, 0, 1638, 1668, 1700, 1718, 0, 1730, 1847, 0, - 0, 1854, - 1924, 1994, 2017, 2087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 2245, 2360, 2475, 2590, 2705, 0, - 2820, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2825, 2874, 2923, 2972, 3021, 0, 3070, 3119, 3147, - 3175, 3203, - 3231, 0, 0, 3379, 3391, 3403, 3415, 3427, 3439, 0, 3451, 3459, 3477, 3495, - 3513, - 0, 0, 0, 0, 0, 3531, 3563, 3581, 3599, 3617, 3635, 0, 3653, 0, 0, 0, 0, - 3882, 0, 3952, - 4022, 4137, 4149, 4264, 4276, 4391, 4403, 4408, 4416, 4421, 4429, 0, 4468, - 0, - 0, 4507, 0, 4525, 0, 4543, 0, 4561, 0, 4579, 0, 4591, 0, 0, 0, 0, 0, 0, - 4603, 4695, - 4738, 0, 4773, 0, 4808, 0, 4843, 0, 0, 4878, 0, 4910, 0, 4942, 4974, 5023, - 5041, - 5090, 0, 0, 5108, 5170, 5287, 5349, 5466, 5528, 5645, 5650, 5657, 5662, - 5669, - 5674, 5681, 0, 5842, 0, 6003, 0, 6031, 0, 6059, 0, 6087, 0, 6115, 0, 6263, - 0, 6306, - 0, 6349, 0, 6392, 6397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6404, 6409, 0, 0, - 6447, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static afm_cuint8 afm_Helvetica_kerning_data[] = { /* 6450 */ - 42, 11, 85, 249, 87, 249, 88, 250, 90, 242, 222, 242, 0, 100, 249, 0, 102, - 249, 0, - 122, 242, 1, 32, 24, 247, 1, 32, 28, 252, 3, 1, 32, 25, 240, 1, 32, 29, - 240, 4, 33, 247, - 1, 32, 25, 240, 1, 32, 29, 240, 2, 33, 249, 2, 33, 249, 49, 68, 252, 72, - 252, 80, 252, - 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250, - 120, 250, - 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, - 252, - 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252, - 252, - 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36, - 252, 0, 78, - 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0, - 112, 249, 0, - 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240, - 12, 45, - 254, 47, 254, 86, 255, 218, 255, 219, 255, 220, 255, 221, 255, 0, 108, - 255, 0, 112, - 255, 0, 114, 255, 0, 116, 255, 3, 45, 252, 47, 252, 18, 45, 245, 47, 245, - 66, 250, - 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250, 196, 250, 197, - 250, 198, - 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 242, 45, 45, 232, - 47, 232, 66, - 244, 98, 249, 102, 252, 112, 252, 115, 249, 193, 244, 194, 244, 195, 244, - 196, 244, - 197, 244, 198, 244, 225, 249, 226, 249, 227, 249, 228, 249, 229, 249, 230, - 249, - 233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246, - 252, - 247, 252, 249, 252, 0, 2, 244, 0, 3, 249, 0, 4, 244, 0, 5, 249, 0, 6, 244, - 0, 7, 249, - 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79, 252, 0, 83, 252, 0, - 87, 249, 0, - 89, 249, 0, 91, 249, 32, 45, 252, 47, 252, 66, 254, 98, 254, 118, 254, - 193, 254, 194, - 254, 195, 254, 196, 254, 197, 254, 198, 254, 225, 254, 226, 254, 227, 254, - 228, - 254, 229, 254, 230, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 2, - 254, 0, 3, - 254, 0, 4, 254, 0, 5, 254, 0, 6, 254, 0, 7, 254, 0, 109, 254, 0, 113, 254, - 0, 115, 254, - 0, 117, 254, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211, - 249, 212, - 249, 213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250, - 236, - 250, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252, - 251, - 252, 252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0, - 27, 250, 0, - 29, 250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0, - 113, 252, 0, - 115, 252, 0, 117, 252, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, - 222, 234, - 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, - 230, 1, 32, 29, - 234, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, - 90, 245, 193, - 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, - 254, 0, 4, - 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 227, 47, - 227, 66, 237, - 98, 250, 102, 249, 112, 249, 193, 237, 194, 237, 195, 237, 196, 237, 197, - 237, 198, - 237, 225, 250, 226, 250, 227, 250, 228, 250, 229, 250, 230, 250, 233, 249, - 234, - 249, 235, 249, 236, 249, 243, 249, 244, 249, 245, 249, 246, 249, 247, 249, - 249, - 249, 0, 2, 237, 0, 3, 250, 0, 4, 237, 0, 5, 250, 0, 6, 237, 0, 7, 250, 0, - 21, 249, 0, 25, - 249, 0, 27, 249, 0, 29, 249, 0, 79, 249, 0, 83, 249, 10, 86, 255, 218, - 255, 219, 255, - 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, - 27, 80, 254, - 85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254, - 214, 254, - 215, 254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0, - 78, 254, - 0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, - 250, 0, 116, - 250, 0, 122, 249, 3, 45, 254, 47, 254, 70, 45, 237, 46, 234, 47, 237, 59, - 254, 60, - 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237, - 120, 237, - 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227, - 237, - 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243, - 237, - 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252, - 237, - 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247, - 0, 6, 237, - 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0, - 79, 247, 0, - 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0, - 113, 237, 0, - 115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, - 195, 250, - 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45, - 236, 46, 244, - 47, 236, 59, 250, 60, 250, 66, 244, 72, 250, 80, 250, 98, 245, 102, 244, - 112, 244, - 118, 245, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 245, 226, 245, 227, - 245, - 228, 245, 229, 245, 230, 245, 233, 244, 234, 244, 235, 244, 236, 244, 243, - 244, - 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 245, 251, 245, 252, - 245, - 253, 245, 0, 2, 244, 0, 3, 245, 0, 4, 244, 0, 5, 245, 0, 6, 244, 0, 7, - 245, 0, 21, 244, - 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 32, 250, 0, 36, 250, 0, 78, 250, 0, - 79, 244, 0, - 82, 250, 0, 83, 244, 0, 109, 245, 0, 113, 245, 0, 115, 245, 0, 117, 245, - 63, 45, 244, - 46, 250, 47, 244, 66, 249, 80, 254, 98, 250, 102, 252, 112, 252, 118, 252, - 122, 254, - 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 211, 254, 212, - 254, - 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227, 250, 228, - 250, - 229, 250, 230, 250, 233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, - 252, - 245, 252, 246, 252, 247, 252, 249, 252, 250, 252, 251, 252, 252, 252, 253, - 252, - 254, 254, 0, 1, 254, 0, 2, 249, 0, 3, 250, 0, 4, 249, 0, 5, 250, 0, 6, - 249, 0, 7, 250, - 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 78, 254, 0, 79, 252, 0, - 82, 254, 0, - 83, 252, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117, 252, 65, 45, 234, - 46, 234, - 47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234, 106, 254, - 112, 234, - 118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, - 243, - 212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226, 234, 227, - 234, - 228, 234, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236, 234, 238, - 254, - 243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250, 239, 251, - 239, - 252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245, 0, 6, 239, - 0, 7, 234, - 0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0, 78, 243, 0, - 79, 234, 0, - 82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0, 117, 239, - 6, 119, 254, - 120, 254, 122, 252, 254, 252, 0, 1, 252, 21, 45, 250, 47, 250, 99, 255, - 109, 254, - 118, 254, 119, 254, 122, 254, 250, 254, 251, 254, 252, 254, 253, 254, 254, - 254, - 0, 1, 254, 0, 60, 254, 0, 62, 254, 0, 68, 254, 0, 109, 254, 0, 113, 254, - 0, 115, 254, - 0, 117, 254, 4, 45, 254, 108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119, - 252, 120, - 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 34, 45, 252, 47, 252, 98, - 252, 102, - 252, 112, 252, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, - 233, - 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246, 252, - 247, - 252, 249, 252, 0, 3, 252, 0, 5, 252, 0, 7, 252, 0, 21, 252, 0, 25, 252, 0, - 27, 252, 0, - 29, 252, 0, 51, 252, 0, 79, 252, 0, 83, 252, 1, 32, 25, 8, 1, 32, 29, 10, - 5, 115, 255, - 0, 87, 255, 0, 89, 255, 0, 91, 255, 4, 122, 252, 254, 252, 0, 1, 252, 19, - 102, 254, - 112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, - 254, - 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, - 254, 0, 79, - 254, 0, 83, 254, 13, 118, 255, 122, 254, 250, 255, 251, 255, 252, 255, - 253, 255, - 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, - 14, 118, 255, - 119, 254, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, - 1, 254, - 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 9, 45, 250, 47, 250, - 119, 254, - 120, 254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 6, 45, 251, 47, 251, - 122, 252, - 254, 252, 0, 1, 252, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3, - 108, 3, 109, - 3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226, - 255, 227, - 255, 228, 255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4, - 250, 3, - 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255, - 0, 45, 3, 0, 49, - 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4, - 0, 101, 7, 0, 109, - 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 4, 45, 254, 47, 254, 120, 252, 31, 45, - 244, 47, 244, - 98, 253, 102, 253, 112, 253, 225, 253, 226, 253, 227, 253, 228, 253, 229, - 253, 230, - 253, 233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244, 253, 245, 253, - 246, - 253, 247, 253, 249, 253, 0, 3, 253, 0, 5, 253, 0, 7, 253, 0, 21, 253, 0, - 25, 253, 0, - 27, 253, 0, 29, 253, 0, 79, 253, 0, 83, 253, 31, 45, 247, 47, 247, 98, - 254, 102, 255, - 112, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233, - 255, - 234, 255, 235, 255, 236, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247, - 255, - 249, 255, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 255, 0, 25, 255, 0, 27, - 255, 0, 29, - 255, 0, 79, 255, 0, 83, 255, 10, 102, 252, 233, 252, 234, 252, 235, 252, - 236, 252, - 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 31, 45, 240, 47, 240, 98, - 254, 102, - 254, 112, 254, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, - 233, - 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, - 247, - 254, 249, 254, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, - 27, 254, 0, - 29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112, 254, 233, 254, 234, - 254, 235, - 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, - 0, 21, - 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 49, 68, - 252, 72, 252, - 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, - 119, 250, - 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, - 252, - 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, - 252, 0, 36, 252, - 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, - 252, 0, 112, - 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, - 122, 240, - 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, - 249, 90, 240, - 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, - 252, - 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 240, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, - 14, 252, - 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, - 249, 87, 245, - 88, 249, 90, 240, 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, - 252, 212, - 252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 240, 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, - 250, 0, 8, - 252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, - 237, 0, 102, - 237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, - 115, 252, - 0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82, - 252, 85, - 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250, 120, 250, - 122, 250, - 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 218, - 249, - 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252, 252, 253, - 252, - 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78, - 252, 0, 82, - 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, - 113, 252, - 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68, - 252, 72, 252, - 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, - 119, 250, - 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, - 252, - 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, - 252, 0, 36, 252, - 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, - 252, 0, 112, - 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, - 122, 240, - 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, - 249, 90, 240, - 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, - 252, - 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 240, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, - 14, 252, - 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 240, 3, 45, 252, 47, 252, 22, 45, 250, 47, 250, 66, 254, 85, - 250, 87, - 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, - 197, 254, - 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, - 250, 0, 122, - 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, - 90, 245, 193, - 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, - 254, 0, 4, - 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, - 250, 66, 254, - 85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, - 196, 254, - 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, - 250, 0, 102, - 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, - 252, 89, 247, - 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, - 245, 0, - 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, - 45, 250, 47, - 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, - 254, 195, - 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, - 254, 0, 100, - 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, - 249, 88, - 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, - 198, 254, - 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, - 122, 245, 13, - 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, - 250, 198, - 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, - 250, 194, - 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, - 250, 13, 45, - 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, - 198, 250, - 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250, - 194, 250, - 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, - 65, 45, 234, - 46, 234, 47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234, - 106, 254, - 112, 234, 118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, - 239, - 211, 243, 212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226, - 234, - 227, 234, 228, 245, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236, - 234, - 238, 254, 243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250, - 239, - 251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245, - 0, 6, 239, - 0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0, - 78, 243, 0, - 79, 245, 0, 82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0, - 117, 239, - 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, - 254, 122, - 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, - 252, 6, - 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, - 122, 252, - 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, - 4, 45, 254, - 108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255, - 252, 255, - 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, - 117, 255, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 95, 45, 241, 47, 241, 98, 248, 99, 248, 100, 248, 101, 248, 102, 248, 103, - 248, 104, - 248, 105, 248, 106, 248, 107, 248, 108, 248, 109, 248, 110, 248, 111, 248, - 112, - 248, 113, 248, 114, 248, 115, 248, 116, 248, 117, 248, 118, 248, 119, 245, - 120, - 245, 121, 243, 122, 245, 123, 248, 225, 248, 226, 248, 227, 248, 228, 248, - 229, - 248, 230, 248, 232, 248, 233, 248, 234, 248, 235, 248, 236, 248, 237, 248, - 238, - 248, 239, 248, 240, 248, 242, 248, 243, 248, 244, 248, 245, 248, 246, 248, - 247, - 248, 249, 248, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0, 1, - 245, 0, 3, - 248, 0, 5, 248, 0, 7, 248, 0, 9, 248, 0, 15, 248, 0, 19, 248, 0, 21, 248, - 0, 25, 248, - 0, 27, 248, 0, 29, 248, 0, 33, 248, 0, 37, 248, 0, 45, 248, 0, 49, 248, 0, - 57, 248, 0, - 60, 248, 0, 62, 248, 0, 68, 248, 0, 70, 248, 0, 72, 248, 0, 74, 248, 0, - 79, 248, 0, 83, - 248, 0, 87, 248, 0, 89, 248, 0, 91, 248, 0, 93, 248, 0, 97, 248, 0, 99, - 248, 0, 101, - 248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, 117, 248, 0, 124, 248, 0, - 126, 248, - 0, 128, 248, 1, 2, 25, 248, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112, - 254, 225, - 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254, - 235, - 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, - 0, 3, - 254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, - 0, 79, 254, - 0, 83, 254, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112, 254, 225, 254, - 226, 254, - 227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254, 235, 254, 236, - 254, - 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 3, 254, 0, - 5, 254, - 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, - 83, 254, 49, - 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, - 90, 240, 118, - 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, - 214, - 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, - 250, - 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, - 252, 0, 32, - 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, - 249, 0, 109, - 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, - 117, 252, - 0, 122, 240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68, - 252, 72, - 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, - 252, 119, - 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, - 215, - 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, - 251, - 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, - 32, 252, 0, - 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, - 109, 252, - 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, - 252, 0, 122, - 240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68, 252, - 72, 252, 80, - 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, - 250, 120, - 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, - 217, - 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, - 252, - 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, - 36, 252, 0, - 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, - 0, 112, 249, - 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, - 240, 6, 119, - 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 3, 45, 252, 47, 252, 4, 45, - 254, 108, - 254, 0, 57, 254, 3, 45, 252, 47, 252, 4, 45, 254, 108, 254, 0, 57, 254, - 18, 45, 245, - 47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250, - 196, 250, - 197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, - 242, 18, 45, - 245, 47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, - 250, 196, - 250, 197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, - 122, 242, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 5, - 115, 255, 0, 87, 255, 0, 89, 255, 0, 91, 255, 5, 115, 255, 0, 87, 255, 0, - 89, 255, 0, - 91, 255, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211, 249, - 212, 249, - 213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250, 236, - 250, - 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0, 27, - 250, 0, 29, - 250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0, 113, - 252, 0, 115, - 252, 0, 117, 252, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235, 254, - 236, 254, - 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, - 25, 254, - 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 14, 85, 239, 87, 239, 88, - 245, 90, 234, - 122, 252, 222, 234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, - 234, 1, - 32, 25, 230, 1, 32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, - 252, 222, - 234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, - 25, 230, 1, - 32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234, - 254, 252, - 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32, - 29, 234, 14, - 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234, 254, 252, 0, 1, - 252, 0, 100, - 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32, 29, 234, 14, 118, - 255, 119, 254, - 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, - 109, 255, - 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254, - 250, 255, - 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, - 255, 0, 115, - 255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255, - 252, 255, - 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, - 117, 255, - 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90, - 245, 193, 254, - 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, - 4, 254, - 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 9, 45, 250, 47, 250, - 119, 254, 120, - 254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 22, 45, 250, 47, 250, 66, - 254, 85, 250, - 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, - 254, 197, - 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, - 102, 250, - 0, 122, 245, 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, - 254, 252, - 0, 1, 252, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211, - 254, 212, - 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250, 220, 250, - 221, - 250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108, - 250, 0, 112, - 250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47, 249, 59, 5, - 60, 5, 98, - 255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, - 5, 122, 5, - 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, 237, 3, 238, - 3, 239, - 3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, - 255, 0, 5, 255, - 0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, - 70, 4, 0, 72, 4, - 0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 27, 80, - 254, 85, 252, - 86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254, 214, - 254, 215, - 254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0, 78, - 254, 0, 82, - 254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, - 116, 250, - 0, 122, 249, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3, 108, 3, - 109, 3, 110, - 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226, 255, - 227, 255, 228, - 255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4, 250, 3, - 251, 3, 252, - 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 45, 3, 0, - 49, 3, 0, 57, 3, - 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4, 0, 101, 7, 0, - 109, 3, 0, 113, - 3, 0, 115, 3, 0, 117, 3, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252, - 90, 249, 211, - 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250, - 220, - 250, 221, 250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252, - 0, 108, - 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47, - 249, 59, - 5, 60, 5, 98, 255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7, - 118, 3, 119, - 5, 122, 5, 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, - 237, 3, 238, - 3, 239, 3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, - 5, 0, 3, 255, - 0, 5, 255, 0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, - 68, 3, 0, 70, 4, - 0, 72, 4, 0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, - 3, 45, 254, 47, - 254, 4, 45, 254, 47, 254, 120, 252, 3, 45, 254, 47, 254, 4, 45, 254, 47, - 254, 120, - 252, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254, 120, 252, 70, 45, 237, 46, - 234, 47, - 237, 59, 254, 60, 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, - 237, 118, - 237, 120, 237, 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, - 198, - 237, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, - 226, - 237, 227, 237, 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, - 236, - 237, 243, 237, 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, - 251, - 237, 252, 237, 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, - 237, 0, 5, - 247, 0, 6, 237, 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, - 0, 78, 250, - 0, 79, 247, 0, 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, - 109, 247, - 0, 113, 237, 0, 115, 237, 0, 117, 237, 70, 45, 237, 46, 234, 47, 237, 59, - 254, 60, - 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237, - 120, 237, - 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227, - 237, - 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243, - 237, - 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252, - 237, - 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247, - 0, 6, 237, - 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0, - 79, 247, 0, - 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0, - 113, 237, 0, - 115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, - 195, 250, - 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, - 250, 47, 250, - 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, - 250, 0, - 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, - 250, 196, - 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, - 250, 66, - 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, - 250, 0, 4, - 250, 0, 6, 250, 65, 45, 234, 46, 234, 47, 234, 59, 247, 60, 247, 66, 239, - 80, 243, - 98, 234, 102, 234, 106, 254, 112, 234, 118, 239, 193, 239, 194, 239, 195, - 239, 196, - 239, 197, 239, 198, 239, 211, 243, 212, 243, 213, 243, 214, 243, 215, 243, - 217, - 243, 225, 234, 226, 234, 227, 234, 228, 245, 229, 234, 230, 234, 233, 234, - 234, - 234, 235, 234, 236, 234, 238, 254, 243, 234, 244, 234, 245, 234, 246, 234, - 247, - 234, 249, 234, 250, 239, 251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3, - 245, 0, 4, - 239, 0, 5, 245, 0, 6, 239, 0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234, - 0, 29, 234, - 0, 49, 254, 0, 78, 243, 0, 79, 234, 0, 82, 243, 0, 83, 234, 0, 109, 239, - 0, 113, 239, - 0, 115, 239, 0, 117, 239, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235, - 254, 236, - 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, - 254, 0, 25, - 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112, - 254, 233, 254, - 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, - 254, - 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, - 83, 254, 19, - 102, 254, 112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, - 254, - 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, - 254, 0, 29, - 254, 0, 79, 254, 0, 83, 254, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254, - 120, 252, 2, - 1, 32, 24, 247, 14, 33, 245, 101, 249, 115, 249, 116, 249, 0, 19, 249, 0, - 87, 249, - 0, 89, 249, 0, 91, 249, 0, 93, 249, 0, 97, 249, 0, 99, 249, 1, 2, 25, 249, - 1, 32, 25, - 247, 2, 33, 250 -}; -static afm_cuint16 afm_Helvetica_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Helvetica_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Helvetica-Bold */ -/* FullName: Helvetica Bold */ -/* FamilyName: Helvetica */ -static afm_cuint8 afm_Helvetica_Bold_widths[] = { /* 315 */ - 46, 56, 79, 93, 93, 148, 120, 40, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93, - 93, 93, 93, - 93, 93, 93, 93, 93, 56, 56, 97, 97, 97, 102, 163, 120, 120, 120, 120, 111, - 102, 130, - 120, 46, 93, 120, 102, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111, - 157, 111, - 111, 102, 56, 46, 56, 97, 93, 56, 93, 102, 93, 102, 93, 56, 102, 102, 46, - 46, 93, 46, - 148, 102, 102, 102, 102, 65, 93, 56, 102, 93, 130, 93, 93, 83, 65, 47, 65, - 97, 56, - 93, 93, 93, 93, 47, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56, - 102, 93, 46, - 56, 56, 61, 93, 139, 139, 139, 102, 120, 120, 120, 120, 120, 120, 167, - 120, 111, - 111, 111, 111, 46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130, - 120, 120, - 120, 120, 111, 111, 102, 93, 93, 93, 93, 93, 93, 148, 93, 93, 93, 93, 93, - 46, 46, 46, - 46, 102, 102, 102, 102, 102, 102, 102, 97, 102, 102, 102, 102, 102, 93, - 102, 93, - 120, 93, 120, 93, 120, 93, 120, 93, 120, 93, 120, 124, 120, 102, 111, 93, - 111, 93, - 111, 93, 111, 93, 130, 102, 130, 102, 46, 46, 46, 46, 46, 46, 120, 93, - 102, 46, 102, - 46, 102, 67, 102, 46, 120, 102, 120, 102, 120, 102, 130, 102, 130, 102, - 167, 157, - 120, 65, 120, 65, 120, 65, 111, 93, 111, 93, 111, 93, 102, 56, 102, 65, - 120, 102, - 120, 102, 120, 102, 120, 102, 111, 102, 83, 102, 83, 102, 83, 93, 111, 93, - 56, 56, - 56, 56, 56, 56, 56, 56, 93, 167, 46, 46, 46, 83, 83, 83, 93, 93, 58, 167, - 167, 56, 56, - 28, 93, 167, 82, 102, 100, 97, 92, 92, 92, 92, 82, 42, 102, 102 -}; -static afm_sint16 afm_Helvetica_Bold_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 51, 54, 0, 0, - 0, 0, 0, 57, 172, 0, 218, 0, 257, 0, 0, 0, 308, 358, 450, 0, 0, 485, 534, - 627, 654, 0, - 716, 874, 902, 1051, 0, 1199, 0, 0, 0, 0, 0, 0, 0, 1338, 1358, 1401, 1427, - 1444, 1462, - 1517, 1548, 0, 0, 1556, 1577, 1587, 1617, 1649, 1663, 0, 1671, 1752, 0, 0, - 1755, - 1803, 1828, 1851, 1921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1944, 2059, 2174, 2289, 2404, 2519, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2634, 2683, 2732, 2781, 2830, 0, 2879, 2928, 2956, - 2984, 3012, - 3040, 0, 0, 3179, 3199, 3219, 3239, 3259, 3279, 0, 3299, 3325, 3343, 3361, - 3379, - 0, 0, 0, 0, 0, 3397, 3429, 3443, 3457, 3471, 3485, 0, 3499, 0, 0, 0, 0, - 3513, 0, 3583, - 3653, 3768, 3788, 3903, 3923, 4038, 0, 4058, 0, 4084, 4110, 0, 4149, 4188, - 0, 4205, - 0, 4223, 0, 4241, 0, 4259, 0, 4277, 0, 4308, 0, 0, 0, 0, 0, 0, 4339, 4431, - 4452, 4487, - 4497, 4532, 0, 0, 4542, 4577, 0, 4587, 0, 4619, 0, 4651, 4683, 4732, 4746, - 4795, - 0, 0, 4809, 4871, 4952, 5014, 5095, 5157, 0, 5238, 0, 5241, 0, 5244, 5247, - 0, 5405, - 0, 5563, 0, 5591, 0, 5619, 0, 5647, 0, 5675, 0, 5814, 0, 5837, 0, 5860, 0, - 0, 5883, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5886, 5891, 0, 0, 5942, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static afm_cuint8 afm_Helvetica_Bold_kerning_data[] = { /* 5945 */ - 42, 11, 85, 240, 87, 244, 88, 244, 90, 237, 222, 237, 0, 100, 240, 0, 102, - 240, 0, - 122, 237, 1, 32, 24, 247, 1, 32, 28, 244, 4, 33, 250, 1, 32, 25, 237, 1, - 32, 29, 237, - 4, 33, 250, 1, 32, 25, 237, 1, 32, 29, 237, 2, 33, 250, 2, 33, 250, 49, - 68, 250, 72, - 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, - 252, 119, - 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, - 215, - 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, - 251, - 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, - 32, 249, 0, - 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, - 109, 252, - 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, - 252, 0, 122, - 239, 20, 66, 252, 86, 255, 193, 252, 194, 252, 195, 252, 196, 252, 197, - 252, 198, - 252, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 252, 0, 4, 252, 0, 6, - 252, 0, 108, - 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 18, 45, 252, 47, 252, 66, 250, - 87, 250, - 88, 250, 90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, - 250, 222, - 245, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 23, 45, 240, 47, 240, - 66, 244, 98, - 254, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 225, 254, - 226, - 254, 227, 254, 228, 254, 229, 254, 230, 254, 0, 2, 244, 0, 3, 254, 0, 4, - 244, 0, 5, - 254, 0, 6, 244, 0, 7, 254, 22, 45, 254, 47, 254, 66, 254, 118, 254, 193, - 254, 194, - 254, 195, 254, 196, 254, 197, 254, 198, 254, 250, 254, 251, 254, 252, 254, - 253, - 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 109, 254, 0, 113, 254, 0, 115, - 254, 0, 117, - 254, 40, 80, 252, 102, 254, 112, 251, 118, 252, 122, 250, 211, 252, 212, - 252, 213, - 252, 214, 252, 215, 252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254, - 243, - 251, 244, 251, 245, 251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252, - 252, - 252, 253, 252, 254, 250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, - 29, 254, - 0, 78, 252, 0, 79, 251, 0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252, - 0, 115, 252, - 0, 117, 252, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237, - 254, 252, - 0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32, - 29, 234, 22, - 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, - 193, 249, - 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, - 4, 249, - 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 237, 47, 237, - 66, 240, 98, - 252, 102, 252, 112, 250, 193, 240, 194, 240, 195, 240, 196, 240, 197, 240, - 198, - 240, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 252, - 234, - 252, 235, 252, 236, 252, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, - 249, - 250, 0, 2, 240, 0, 3, 252, 0, 4, 240, 0, 5, 252, 0, 6, 240, 0, 7, 252, 0, - 21, 252, 0, 25, - 252, 0, 27, 252, 0, 29, 252, 0, 79, 250, 0, 83, 250, 12, 45, 3, 47, 3, 86, - 255, 218, - 255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, - 0, 116, - 255, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, - 212, 254, - 213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, - 254, - 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, - 0, 112, 254, - 0, 114, 254, 0, 116, 254, 0, 122, 249, 69, 45, 244, 46, 237, 47, 244, 59, - 250, 60, - 250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242, - 120, 247, - 122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227, - 244, - 228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243, - 244, - 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252, - 242, - 253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244, - 0, 6, 242, - 0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0, - 79, 244, 0, - 82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0, - 115, 242, - 0, 117, 242, 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, - 196, 249, - 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 65, 45, 237, 46, 244, - 47, 237, - 59, 250, 60, 250, 66, 244, 72, 249, 80, 249, 98, 247, 102, 249, 112, 242, - 118, 247, - 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211, 249, 212, - 249, - 213, 249, 214, 249, 215, 249, 217, 249, 225, 247, 226, 247, 227, 247, 228, - 247, - 229, 247, 230, 247, 233, 249, 234, 249, 235, 249, 236, 249, 243, 242, 244, - 242, - 245, 242, 246, 242, 247, 242, 249, 242, 250, 247, 251, 247, 252, 247, 253, - 247, - 0, 2, 244, 0, 3, 247, 0, 4, 244, 0, 5, 247, 0, 6, 244, 0, 7, 247, 0, 21, - 249, 0, 25, 249, - 0, 27, 249, 0, 29, 249, 0, 32, 249, 0, 36, 249, 0, 78, 249, 0, 79, 242, 0, - 82, 249, 0, - 83, 242, 0, 109, 247, 0, 113, 247, 0, 115, 247, 0, 117, 247, 65, 45, 244, - 46, 250, - 47, 244, 59, 255, 60, 255, 66, 247, 80, 254, 98, 250, 102, 251, 112, 247, - 118, 249, - 122, 254, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 211, - 254, - 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227, - 250, - 228, 250, 229, 250, 230, 250, 233, 251, 234, 251, 235, 251, 236, 251, 243, - 247, - 244, 247, 245, 247, 246, 247, 247, 247, 249, 247, 250, 249, 251, 249, 252, - 249, - 253, 249, 254, 254, 0, 1, 254, 0, 2, 247, 0, 3, 250, 0, 4, 247, 0, 5, 250, - 0, 6, 247, - 0, 7, 250, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 78, 254, 0, - 79, 247, 0, - 82, 254, 0, 83, 247, 0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249, - 61, 45, 240, - 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240, - 118, 240, - 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212, - 245, - 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228, - 242, - 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244, - 240, - 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253, - 240, - 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21, - 244, 0, 25, 244, - 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0, - 109, 240, - 0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254, - 122, 254, - 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 18, 109, 255, 118, 254, 119, - 254, 122, - 254, 250, 254, 251, 254, 252, 254, 253, 254, 254, 254, 0, 1, 254, 0, 60, - 255, 0, 62, - 255, 0, 68, 255, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254, 11, - 105, 255, - 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, - 0, 62, 254, - 0, 68, 254, 8, 101, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1, - 254, 0, 19, - 255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, - 1, 254, - 23, 45, 255, 47, 255, 102, 255, 112, 254, 233, 255, 234, 255, 235, 255, - 236, 255, - 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 255, 0, - 25, 255, - 0, 27, 255, 0, 29, 255, 0, 79, 254, 0, 83, 254, 1, 32, 25, 5, 1, 32, 29, - 5, 13, 102, 2, - 104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, - 29, 2, 0, 33, - 255, 0, 37, 255, 4, 122, 254, 254, 254, 0, 1, 254, 10, 112, 254, 243, 254, - 244, 254, - 245, 254, 246, 254, 247, 254, 249, 254, 0, 79, 254, 0, 83, 254, 5, 120, - 254, 122, - 254, 254, 254, 0, 1, 254, 13, 118, 254, 122, 252, 250, 254, 251, 254, 252, - 254, 253, - 254, 254, 252, 0, 1, 252, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, - 254, 14, 118, - 255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, - 0, 1, - 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120, - 254, 121, - 252, 122, 254, 254, 254, 0, 1, 254, 4, 122, 254, 254, 254, 0, 1, 254, 34, - 45, 247, - 46, 254, 47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116, - 254, 117, - 3, 119, 2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, - 254, 249, - 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0, - 37, 254, 0, 79, - 254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25, - 254, 2, 120, - 254, 22, 45, 244, 47, 244, 98, 254, 112, 252, 225, 254, 226, 254, 227, - 254, 228, - 254, 229, 254, 230, 254, 243, 252, 244, 252, 245, 252, 246, 252, 247, 252, - 249, - 252, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 79, 252, 0, 83, 252, 12, 45, 250, - 47, 250, 112, - 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79, - 254, 0, 83, - 254, 10, 102, 255, 233, 255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0, - 25, 255, - 0, 27, 255, 0, 29, 255, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, - 225, 252, - 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, - 255, - 236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, - 3, 252, - 0, 5, 252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, - 79, 253, 0, 83, - 253, 10, 102, 2, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, - 27, 2, 0, 29, 2, - 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, - 247, 90, 239, - 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, - 250, - 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 239, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, - 14, 250, - 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, - 249, 87, 244, - 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, - 250, 212, - 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, - 252, 0, 8, - 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, - 242, 0, 102, - 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, - 115, 252, - 0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, - 250, 85, - 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, - 122, 252, - 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, - 249, - 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, - 252, - 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, - 250, 0, 82, - 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, - 113, 252, - 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68, - 250, 72, 249, - 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252, - 119, 250, - 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215, - 250, - 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, - 249, 0, 36, 249, - 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109, - 252, 0, 112, - 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, - 122, 239, - 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, - 247, 90, 239, - 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, - 250, - 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 239, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, - 14, 250, - 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, - 249, 87, 244, - 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, - 250, 212, - 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, - 252, 0, 8, - 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, - 242, 0, 102, - 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, - 115, 252, - 0, 116, 249, 0, 117, 252, 0, 122, 239, 22, 45, 250, 47, 250, 66, 249, 85, - 250, 87, - 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, - 197, 249, - 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, - 250, 0, 122, - 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, - 90, 245, 193, - 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, - 249, 0, 4, - 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, - 250, 66, 249, - 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, - 196, 249, - 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, - 250, 0, 102, - 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, - 249, 89, 249, - 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, - 245, 0, - 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, - 45, 250, 47, - 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, - 249, 195, - 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, - 249, 0, 100, - 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, - 249, 88, - 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, - 198, 249, - 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, - 122, 245, 13, - 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, - 249, 198, - 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193, - 249, 194, - 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, - 249, 13, 45, - 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, - 198, 249, - 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193, 249, - 194, 249, - 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, - 61, 45, 240, - 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240, - 118, 240, - 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212, - 245, - 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228, - 242, - 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244, - 240, - 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253, - 240, - 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21, - 244, 0, 25, 244, - 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0, - 109, 240, - 0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254, - 122, 254, - 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254, 120, - 254, 122, - 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254, - 120, 254, - 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, - 254, 120, - 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, - 119, 254, - 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, - 255, 119, - 254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11, - 105, 255, - 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, - 0, 62, 254, - 0, 68, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, - 254, 0, 1, - 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, - 1, 254, - 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1, - 254, 9, 45, - 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1, 254, 14, - 118, 255, - 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, - 1, 254, - 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120, 254, - 121, 252, - 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254, - 254, 254, - 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, - 7, 119, - 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, - 254, 121, - 252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, - 254, 254, - 254, 0, 1, 254, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225, - 252, 226, - 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255, - 236, - 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3, - 252, 0, 5, - 252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, - 253, 0, 83, 253, - 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225, 252, 226, 252, - 227, 252, - 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255, 236, 255, 243, - 253, - 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3, 252, 0, 5, 252, 0, - 7, 252, - 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83, 253, - 49, 68, 250, - 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, - 118, 252, - 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, - 250, - 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, - 252, - 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, - 0, 32, 249, - 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, - 0, 109, 252, - 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, - 252, 0, 122, - 239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, - 33, 255, 0, - 37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, - 244, 88, 247, - 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, - 250, 213, - 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, - 250, 0, 14, - 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, - 242, 0, 108, - 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, - 116, 249, - 0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254, - 254, 0, - 1, 254, 0, 33, 255, 0, 37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250, - 85, 242, 86, - 249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, - 200, 250, - 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, - 249, - 220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, - 252, - 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, - 82, 250, 0, 100, - 242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, - 114, 249, - 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254, - 120, 254, - 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11, 105, 255, 108, - 254, 109, - 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, 0, 62, 254, 0, - 68, 254, - 11, 105, 255, 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, - 254, 0, 60, - 254, 0, 62, 254, 0, 68, 254, 18, 45, 252, 47, 252, 66, 250, 87, 250, 88, - 250, 90, 245, - 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 245, 0, - 2, 250, - 0, 4, 250, 0, 6, 250, 0, 122, 245, 18, 45, 252, 47, 252, 66, 250, 87, 250, - 88, 250, - 90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, - 245, 0, - 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 8, 101, 255, 119, 254, 120, - 254, 122, 254, - 254, 254, 0, 1, 254, 0, 19, 255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, - 254, 122, - 254, 254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, - 254, 254, - 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, - 254, 254, - 0, 1, 254, 13, 102, 2, 104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, - 0, 25, 2, 0, - 27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255, 13, 102, 2, 104, 255, 233, 2, - 234, 2, 235, 2, - 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255, - 40, 80, 252, 102, - 254, 112, 251, 118, 252, 122, 250, 211, 252, 212, 252, 213, 252, 214, 252, - 215, - 252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254, 243, 251, 244, 251, - 245, - 251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252, 252, 252, 253, 252, - 254, - 250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 78, - 252, 0, 79, 251, - 0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117, - 252, 10, 112, - 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79, - 254, 0, 83, - 254, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237, 254, 252, - 0, 1, 252, - 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5, - 120, 254, - 122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87, 239, 88, 244, 90, 237, - 122, 252, 222, - 237, 254, 252, 0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, - 25, 234, 1, - 32, 29, 234, 5, 120, 254, 122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87, - 239, 88, - 244, 90, 237, 122, 252, 222, 237, 254, 252, 0, 1, 252, 0, 100, 242, 0, - 102, 242, 0, - 122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5, 120, 254, 122, 254, 254, 254, - 0, 1, 254, - 14, 118, 255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, - 254, 254, - 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, - 255, 119, 250, - 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, - 109, 255, - 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 250, 122, 254, - 250, 255, - 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, - 255, 0, 115, - 255, 0, 117, 255, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, - 249, 89, 249, - 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, - 245, 0, - 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 7, - 119, 254, 120, - 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 22, 45, 250, 47, 250, 66, - 249, 85, 250, - 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, - 249, 197, - 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, - 102, 250, - 0, 122, 245, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 27, 80, - 254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213, - 254, 214, - 254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249, - 0, 78, - 254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0, - 114, 254, 0, - 116, 254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254, - 104, 254, - 112, 254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254, - 244, 254, - 245, 254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, - 254, 0, 19, - 254, 0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97, - 254, 0, 99, 254, - 0, 101, 3, 1, 2, 25, 254, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250, - 90, 249, - 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219, - 254, - 220, 254, 221, 254, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102, - 254, 0, - 108, 254, 0, 112, 254, 0, 114, 254, 0, 116, 254, 0, 122, 249, 34, 45, 247, - 46, 254, - 47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116, 254, 117, - 3, 119, - 2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, - 249, 254, - 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0, 37, - 254, 0, 79, 254, - 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25, 254, - 27, 80, 254, - 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213, 254, - 214, 254, - 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249, 0, - 78, 254, - 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0, 114, - 254, 0, 116, - 254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254, 104, - 254, 112, - 254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254, 244, - 254, 245, - 254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, - 0, 19, 254, - 0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, - 99, 254, 0, - 101, 3, 1, 2, 25, 254, 2, 120, 254, 2, 120, 254, 2, 120, 254, 69, 45, 244, - 46, 237, - 47, 244, 59, 250, 60, 250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244, - 115, 244, - 118, 242, 120, 247, 122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197, - 242, - 198, 242, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, - 244, - 226, 244, 227, 244, 228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235, - 247, - 236, 247, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, - 242, - 251, 242, 252, 242, 253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, - 0, 4, 242, - 0, 5, 244, 0, 6, 242, 0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, - 29, 247, 0, 78, - 250, 0, 79, 244, 0, 82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, - 242, 0, 113, - 242, 0, 115, 242, 0, 117, 242, 69, 45, 244, 46, 237, 47, 244, 59, 250, 60, - 250, 66, - 242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242, 120, 247, - 122, 247, - 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 250, 212, - 250, - 213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227, 244, 228, - 244, - 229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243, 244, 244, - 244, - 245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252, 242, 253, - 242, - 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244, 0, 6, - 242, 0, 7, 244, - 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0, 79, 244, 0, - 82, 250, 0, - 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0, - 117, 242, - 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, - 197, 249, - 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, - 193, 249, - 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, - 6, 249, - 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, - 197, 249, - 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, - 193, 249, - 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, - 6, 249, - 61, 45, 240, 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, - 244, 112, - 240, 118, 240, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, - 211, - 245, 212, 245, 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, - 227, - 242, 228, 242, 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, - 243, - 240, 244, 240, 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, - 252, - 240, 253, 240, 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, - 7, 242, 0, 21, - 244, 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, - 245, 0, 83, 240, - 0, 109, 240, 0, 113, 240, 0, 115, 240, 0, 117, 240, 10, 102, 2, 233, 2, - 234, 2, 235, - 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2, - 234, 2, 235, 2, 236, - 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2, 234, 2, - 235, 2, 236, 2, 0, - 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 2, 120, 254, 2, 1, 32, 24, 249, 19, - 33, 244, 101, - 244, 109, 254, 115, 250, 116, 247, 119, 254, 0, 19, 244, 0, 60, 254, 0, - 62, 254, 0, - 68, 254, 0, 87, 250, 0, 89, 250, 0, 91, 250, 0, 93, 247, 0, 97, 247, 0, - 99, 247, 1, 2, - 25, 247, 1, 32, 25, 249, 2, 33, 244 -}; -static afm_cuint16 afm_Helvetica_Bold_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Helvetica_Bold_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Helvetica-BoldOblique */ -/* FullName: Helvetica Bold Oblique */ -/* FamilyName: Helvetica */ -static afm_cuint8 afm_Helvetica_BoldOblique_widths[] = { /* 315 */ - 46, 56, 79, 93, 93, 148, 120, 40, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93, - 93, 93, 93, - 93, 93, 93, 93, 93, 56, 56, 97, 97, 97, 102, 163, 120, 120, 120, 120, 111, - 102, 130, - 120, 46, 93, 120, 102, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111, - 157, 111, - 111, 102, 56, 46, 56, 97, 93, 56, 93, 102, 93, 102, 93, 56, 102, 102, 46, - 46, 93, 46, - 148, 102, 102, 102, 102, 65, 93, 56, 102, 93, 130, 93, 93, 83, 65, 47, 65, - 97, 56, - 93, 93, 93, 93, 47, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56, - 102, 93, 46, - 56, 56, 61, 93, 139, 139, 139, 102, 120, 120, 120, 120, 120, 120, 167, - 120, 111, - 111, 111, 111, 46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130, - 120, 120, - 120, 120, 111, 111, 102, 93, 93, 93, 93, 93, 93, 148, 93, 93, 93, 93, 93, - 46, 46, 46, - 46, 102, 102, 102, 102, 102, 102, 102, 97, 102, 102, 102, 102, 102, 93, - 102, 93, - 120, 93, 120, 93, 120, 93, 120, 93, 120, 93, 120, 124, 120, 102, 111, 93, - 111, 93, - 111, 93, 111, 93, 130, 102, 130, 102, 46, 46, 46, 46, 46, 46, 120, 93, - 102, 46, 102, - 46, 102, 67, 102, 46, 120, 102, 120, 102, 120, 102, 130, 102, 130, 102, - 167, 157, - 120, 65, 120, 65, 120, 65, 111, 93, 111, 93, 111, 93, 102, 56, 102, 65, - 120, 102, - 120, 102, 120, 102, 120, 102, 111, 102, 83, 102, 83, 102, 83, 93, 111, 93, - 56, 56, - 56, 56, 56, 56, 56, 56, 93, 167, 46, 46, 46, 83, 83, 83, 93, 93, 58, 167, - 167, 56, 56, - 28, 93, 167, 82, 102, 100, 97, 92, 92, 92, 92, 82, 42, 102, 102 -}; -static afm_sint16 afm_Helvetica_BoldOblique_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 51, 54, 0, 0, - 0, 0, 0, 57, 172, 0, 218, 0, 257, 0, 0, 0, 308, 358, 450, 0, 0, 485, 534, - 627, 654, 0, - 716, 874, 902, 1051, 0, 1199, 0, 0, 0, 0, 0, 0, 0, 1338, 1358, 1401, 1427, - 1444, 1462, - 1517, 1548, 0, 0, 1556, 1577, 1587, 1617, 1649, 1663, 0, 1671, 1752, 0, 0, - 1755, - 1803, 1828, 1851, 1921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1944, 2059, 2174, 2289, 2404, 2519, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2634, 2683, 2732, 2781, 2830, 0, 2879, 2928, 2956, - 2984, 3012, - 3040, 0, 0, 3179, 3199, 3219, 3239, 3259, 3279, 0, 3299, 3325, 3343, 3361, - 3379, - 0, 0, 0, 0, 0, 3397, 3429, 3443, 3457, 3471, 3485, 0, 3499, 0, 0, 0, 0, - 3513, 0, 3583, - 3653, 3768, 3788, 3903, 3923, 4038, 0, 4058, 0, 4084, 4110, 0, 4149, 4188, - 0, 4205, - 0, 4223, 0, 4241, 0, 4259, 0, 4277, 0, 4308, 0, 0, 0, 0, 0, 0, 4339, 4431, - 4452, 4487, - 4497, 4532, 0, 0, 4542, 4577, 0, 4587, 0, 4619, 0, 4651, 4683, 4732, 4746, - 4795, - 0, 0, 4809, 4871, 4952, 5014, 5095, 5157, 0, 5238, 0, 5241, 0, 5244, 5247, - 0, 5405, - 0, 5563, 0, 5591, 0, 5619, 0, 5647, 0, 5675, 0, 5814, 0, 5837, 0, 5860, 0, - 0, 5883, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5886, 5891, 0, 0, 5942, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static afm_cuint8 afm_Helvetica_BoldOblique_kerning_data[] = { /* 5945 */ - 42, 11, 85, 240, 87, 244, 88, 244, 90, 237, 222, 237, 0, 100, 240, 0, 102, - 240, 0, - 122, 237, 1, 32, 24, 247, 1, 32, 28, 244, 4, 33, 250, 1, 32, 25, 237, 1, - 32, 29, 237, - 4, 33, 250, 1, 32, 25, 237, 1, 32, 29, 237, 2, 33, 250, 2, 33, 250, 49, - 68, 250, 72, - 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, - 252, 119, - 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, - 215, - 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, - 251, - 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, - 32, 249, 0, - 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, - 109, 252, - 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, - 252, 0, 122, - 239, 20, 66, 252, 86, 255, 193, 252, 194, 252, 195, 252, 196, 252, 197, - 252, 198, - 252, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 252, 0, 4, 252, 0, 6, - 252, 0, 108, - 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 18, 45, 252, 47, 252, 66, 250, - 87, 250, - 88, 250, 90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, - 250, 222, - 245, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 23, 45, 240, 47, 240, - 66, 244, 98, - 254, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 225, 254, - 226, - 254, 227, 254, 228, 254, 229, 254, 230, 254, 0, 2, 244, 0, 3, 254, 0, 4, - 244, 0, 5, - 254, 0, 6, 244, 0, 7, 254, 22, 45, 254, 47, 254, 66, 254, 118, 254, 193, - 254, 194, - 254, 195, 254, 196, 254, 197, 254, 198, 254, 250, 254, 251, 254, 252, 254, - 253, - 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 109, 254, 0, 113, 254, 0, 115, - 254, 0, 117, - 254, 40, 80, 252, 102, 254, 112, 251, 118, 252, 122, 250, 211, 252, 212, - 252, 213, - 252, 214, 252, 215, 252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254, - 243, - 251, 244, 251, 245, 251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252, - 252, - 252, 253, 252, 254, 250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, - 29, 254, - 0, 78, 252, 0, 79, 251, 0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252, - 0, 115, 252, - 0, 117, 252, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237, - 254, 252, - 0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32, - 29, 234, 22, - 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, - 193, 249, - 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, - 4, 249, - 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 237, 47, 237, - 66, 240, 98, - 252, 102, 252, 112, 250, 193, 240, 194, 240, 195, 240, 196, 240, 197, 240, - 198, - 240, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 252, - 234, - 252, 235, 252, 236, 252, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, - 249, - 250, 0, 2, 240, 0, 3, 252, 0, 4, 240, 0, 5, 252, 0, 6, 240, 0, 7, 252, 0, - 21, 252, 0, 25, - 252, 0, 27, 252, 0, 29, 252, 0, 79, 250, 0, 83, 250, 12, 45, 3, 47, 3, 86, - 255, 218, - 255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, - 0, 116, - 255, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, - 212, 254, - 213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, - 254, - 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, - 0, 112, 254, - 0, 114, 254, 0, 116, 254, 0, 122, 249, 69, 45, 244, 46, 237, 47, 244, 59, - 250, 60, - 250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242, - 120, 247, - 122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227, - 244, - 228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243, - 244, - 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252, - 242, - 253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244, - 0, 6, 242, - 0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0, - 79, 244, 0, - 82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0, - 115, 242, - 0, 117, 242, 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, - 196, 249, - 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 65, 45, 237, 46, 244, - 47, 237, - 59, 250, 60, 250, 66, 244, 72, 249, 80, 249, 98, 247, 102, 249, 112, 242, - 118, 247, - 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211, 249, 212, - 249, - 213, 249, 214, 249, 215, 249, 217, 249, 225, 247, 226, 247, 227, 247, 228, - 247, - 229, 247, 230, 247, 233, 249, 234, 249, 235, 249, 236, 249, 243, 242, 244, - 242, - 245, 242, 246, 242, 247, 242, 249, 242, 250, 247, 251, 247, 252, 247, 253, - 247, - 0, 2, 244, 0, 3, 247, 0, 4, 244, 0, 5, 247, 0, 6, 244, 0, 7, 247, 0, 21, - 249, 0, 25, 249, - 0, 27, 249, 0, 29, 249, 0, 32, 249, 0, 36, 249, 0, 78, 249, 0, 79, 242, 0, - 82, 249, 0, - 83, 242, 0, 109, 247, 0, 113, 247, 0, 115, 247, 0, 117, 247, 65, 45, 244, - 46, 250, - 47, 244, 59, 255, 60, 255, 66, 247, 80, 254, 98, 250, 102, 251, 112, 247, - 118, 249, - 122, 254, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 211, - 254, - 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227, - 250, - 228, 250, 229, 250, 230, 250, 233, 251, 234, 251, 235, 251, 236, 251, 243, - 247, - 244, 247, 245, 247, 246, 247, 247, 247, 249, 247, 250, 249, 251, 249, 252, - 249, - 253, 249, 254, 254, 0, 1, 254, 0, 2, 247, 0, 3, 250, 0, 4, 247, 0, 5, 250, - 0, 6, 247, - 0, 7, 250, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 78, 254, 0, - 79, 247, 0, - 82, 254, 0, 83, 247, 0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249, - 61, 45, 240, - 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240, - 118, 240, - 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212, - 245, - 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228, - 242, - 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244, - 240, - 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253, - 240, - 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21, - 244, 0, 25, 244, - 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0, - 109, 240, - 0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254, - 122, 254, - 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 18, 109, 255, 118, 254, 119, - 254, 122, - 254, 250, 254, 251, 254, 252, 254, 253, 254, 254, 254, 0, 1, 254, 0, 60, - 255, 0, 62, - 255, 0, 68, 255, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254, 11, - 105, 255, - 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, - 0, 62, 254, - 0, 68, 254, 8, 101, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1, - 254, 0, 19, - 255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, - 1, 254, - 23, 45, 255, 47, 255, 102, 255, 112, 254, 233, 255, 234, 255, 235, 255, - 236, 255, - 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 255, 0, - 25, 255, - 0, 27, 255, 0, 29, 255, 0, 79, 254, 0, 83, 254, 1, 32, 25, 5, 1, 32, 29, - 5, 13, 102, 2, - 104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, - 29, 2, 0, 33, - 255, 0, 37, 255, 4, 122, 254, 254, 254, 0, 1, 254, 10, 112, 254, 243, 254, - 244, 254, - 245, 254, 246, 254, 247, 254, 249, 254, 0, 79, 254, 0, 83, 254, 5, 120, - 254, 122, - 254, 254, 254, 0, 1, 254, 13, 118, 254, 122, 252, 250, 254, 251, 254, 252, - 254, 253, - 254, 254, 252, 0, 1, 252, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, - 254, 14, 118, - 255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, - 0, 1, - 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120, - 254, 121, - 252, 122, 254, 254, 254, 0, 1, 254, 4, 122, 254, 254, 254, 0, 1, 254, 34, - 45, 247, - 46, 254, 47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116, - 254, 117, - 3, 119, 2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, - 254, 249, - 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0, - 37, 254, 0, 79, - 254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25, - 254, 2, 120, - 254, 22, 45, 244, 47, 244, 98, 254, 112, 252, 225, 254, 226, 254, 227, - 254, 228, - 254, 229, 254, 230, 254, 243, 252, 244, 252, 245, 252, 246, 252, 247, 252, - 249, - 252, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 79, 252, 0, 83, 252, 12, 45, 250, - 47, 250, 112, - 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79, - 254, 0, 83, - 254, 10, 102, 255, 233, 255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0, - 25, 255, - 0, 27, 255, 0, 29, 255, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, - 225, 252, - 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, - 255, - 236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, - 3, 252, - 0, 5, 252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, - 79, 253, 0, 83, - 253, 10, 102, 2, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, - 27, 2, 0, 29, 2, - 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, - 247, 90, 239, - 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, - 250, - 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 239, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, - 14, 250, - 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, - 249, 87, 244, - 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, - 250, 212, - 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, - 252, 0, 8, - 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, - 242, 0, 102, - 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, - 115, 252, - 0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, - 250, 85, - 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, - 122, 252, - 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, - 249, - 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, - 252, - 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, - 250, 0, 82, - 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, - 113, 252, - 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 49, 68, - 250, 72, 249, - 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, 118, 252, - 119, 250, - 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, 250, 215, - 250, - 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, - 249, 0, 36, 249, - 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, 0, 109, - 252, 0, 112, - 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, - 122, 239, - 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, - 247, 90, 239, - 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, - 250, - 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 239, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, - 14, 250, - 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 239, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, - 249, 87, 244, - 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, - 250, 212, - 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, - 252, 0, 8, - 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, - 242, 0, 102, - 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, - 115, 252, - 0, 116, 249, 0, 117, 252, 0, 122, 239, 22, 45, 250, 47, 250, 66, 249, 85, - 250, 87, - 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, - 197, 249, - 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, - 250, 0, 122, - 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, - 90, 245, 193, - 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, - 249, 0, 4, - 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, - 250, 66, 249, - 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, - 196, 249, - 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, - 250, 0, 102, - 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, - 249, 89, 249, - 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, - 245, 0, - 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, - 45, 250, 47, - 250, 66, 249, 85, 250, 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, - 249, 195, - 249, 196, 249, 197, 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, - 249, 0, 100, - 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, - 249, 88, - 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, - 198, 249, - 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, - 122, 245, 13, - 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, - 249, 198, - 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193, - 249, 194, - 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, - 249, 13, 45, - 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, - 198, 249, - 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, 193, 249, - 194, 249, - 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, - 61, 45, 240, - 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, 244, 112, 240, - 118, 240, - 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 245, 212, - 245, - 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, 227, 242, 228, - 242, - 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, 243, 240, 244, - 240, - 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, 252, 240, 253, - 240, - 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, 7, 242, 0, 21, - 244, 0, 25, 244, - 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, 245, 0, 83, 240, 0, - 109, 240, - 0, 113, 240, 0, 115, 240, 0, 117, 240, 9, 104, 255, 119, 254, 120, 254, - 122, 254, - 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254, 120, - 254, 122, - 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, 254, - 120, 254, - 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, 119, - 254, 120, - 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, 255, - 119, 254, - 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 9, 104, - 255, 119, - 254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11, - 105, 255, - 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, - 0, 62, 254, - 0, 68, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, - 254, 0, 1, - 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, - 1, 254, - 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1, - 254, 9, 45, - 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, 254, 254, 0, 1, 254, 14, - 118, 255, - 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, - 1, 254, - 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 7, 119, 254, 120, 254, - 121, 252, - 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254, - 254, 254, - 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, - 7, 119, - 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, - 254, 121, - 252, 122, 254, 254, 254, 0, 1, 254, 7, 119, 254, 120, 254, 121, 252, 122, - 254, 254, - 254, 0, 1, 254, 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225, - 252, 226, - 252, 227, 252, 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255, - 236, - 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3, - 252, 0, 5, - 252, 0, 7, 252, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, - 253, 0, 83, 253, - 31, 45, 244, 47, 244, 98, 252, 102, 255, 112, 253, 225, 252, 226, 252, - 227, 252, - 228, 252, 229, 252, 230, 252, 233, 255, 234, 255, 235, 255, 236, 255, 243, - 253, - 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 0, 3, 252, 0, 5, 252, 0, - 7, 252, - 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83, 253, - 49, 68, 250, - 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, 244, 88, 247, 90, 239, - 118, 252, - 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, 250, 213, 250, 214, - 250, - 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 239, 250, - 252, - 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, 250, 0, 14, 250, - 0, 32, 249, - 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, 242, 0, 108, 249, - 0, 109, 252, - 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, - 252, 0, 122, - 239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254, 254, 0, 1, 254, 0, - 33, 255, 0, - 37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250, 85, 242, 86, 249, 87, - 244, 88, 247, - 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, 200, 250, 211, 250, 212, - 250, 213, - 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, 252, 0, 1, 252, 0, 8, - 250, 0, 14, - 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, 82, 250, 0, 100, 242, 0, 102, - 242, 0, 108, - 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, - 116, 249, - 0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254, 120, 254, 122, 254, 254, - 254, 0, - 1, 254, 0, 33, 255, 0, 37, 255, 49, 68, 250, 72, 249, 80, 250, 82, 250, - 85, 242, 86, - 249, 87, 244, 88, 247, 90, 239, 118, 252, 119, 250, 120, 252, 122, 252, - 200, 250, - 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, - 249, - 220, 249, 221, 249, 222, 239, 250, 252, 251, 252, 252, 252, 253, 252, 254, - 252, - 0, 1, 252, 0, 8, 250, 0, 14, 250, 0, 32, 249, 0, 36, 249, 0, 78, 250, 0, - 82, 250, 0, 100, - 242, 0, 102, 242, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, - 114, 249, - 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 239, 9, 104, 255, 119, 254, - 120, 254, - 122, 254, 254, 254, 0, 1, 254, 0, 33, 255, 0, 37, 255, 11, 105, 255, 108, - 254, 109, - 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, 254, 0, 60, 254, 0, 62, 254, 0, - 68, 254, - 11, 105, 255, 108, 254, 109, 254, 122, 255, 254, 255, 0, 1, 255, 0, 57, - 254, 0, 60, - 254, 0, 62, 254, 0, 68, 254, 18, 45, 252, 47, 252, 66, 250, 87, 250, 88, - 250, 90, 245, - 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 245, 0, - 2, 250, - 0, 4, 250, 0, 6, 250, 0, 122, 245, 18, 45, 252, 47, 252, 66, 250, 87, 250, - 88, 250, - 90, 245, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, - 245, 0, - 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 245, 8, 101, 255, 119, 254, 120, - 254, 122, 254, - 254, 254, 0, 1, 254, 0, 19, 255, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, - 254, 122, - 254, 254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, - 254, 254, - 254, 0, 1, 254, 9, 45, 2, 47, 3, 119, 254, 120, 254, 121, 254, 122, 254, - 254, 254, - 0, 1, 254, 13, 102, 2, 104, 255, 233, 2, 234, 2, 235, 2, 236, 2, 0, 21, 2, - 0, 25, 2, 0, - 27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255, 13, 102, 2, 104, 255, 233, 2, - 234, 2, 235, 2, - 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 0, 33, 255, 0, 37, 255, - 40, 80, 252, 102, - 254, 112, 251, 118, 252, 122, 250, 211, 252, 212, 252, 213, 252, 214, 252, - 215, - 252, 217, 252, 233, 254, 234, 254, 235, 254, 236, 254, 243, 251, 244, 251, - 245, - 251, 246, 251, 247, 251, 249, 251, 250, 252, 251, 252, 252, 252, 253, 252, - 254, - 250, 0, 1, 250, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 78, - 252, 0, 79, 251, - 0, 82, 252, 0, 83, 251, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117, - 252, 10, 112, - 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 79, - 254, 0, 83, - 254, 14, 85, 242, 87, 239, 88, 244, 90, 237, 122, 252, 222, 237, 254, 252, - 0, 1, 252, - 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5, - 120, 254, - 122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87, 239, 88, 244, 90, 237, - 122, 252, 222, - 237, 254, 252, 0, 1, 252, 0, 100, 242, 0, 102, 242, 0, 122, 237, 1, 32, - 25, 234, 1, - 32, 29, 234, 5, 120, 254, 122, 254, 254, 254, 0, 1, 254, 14, 85, 242, 87, - 239, 88, - 244, 90, 237, 122, 252, 222, 237, 254, 252, 0, 1, 252, 0, 100, 242, 0, - 102, 242, 0, - 122, 237, 1, 32, 25, 234, 1, 32, 29, 234, 5, 120, 254, 122, 254, 254, 254, - 0, 1, 254, - 14, 118, 255, 119, 250, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, - 254, 254, - 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, - 255, 119, 250, - 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, - 109, 255, - 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 250, 122, 254, - 250, 255, - 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, - 255, 0, 115, - 255, 0, 117, 255, 22, 45, 250, 47, 250, 66, 249, 85, 250, 87, 249, 88, - 249, 89, 249, - 90, 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 222, - 245, 0, - 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, 102, 250, 0, 122, 245, 7, - 119, 254, 120, - 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 22, 45, 250, 47, 250, 66, - 249, 85, 250, - 87, 249, 88, 249, 89, 249, 90, 245, 193, 249, 194, 249, 195, 249, 196, - 249, 197, - 249, 198, 249, 222, 245, 0, 2, 249, 0, 4, 249, 0, 6, 249, 0, 100, 250, 0, - 102, 250, - 0, 122, 245, 7, 119, 254, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 27, 80, - 254, 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213, - 254, 214, - 254, 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249, - 0, 78, - 254, 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0, - 114, 254, 0, - 116, 254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254, - 104, 254, - 112, 254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254, - 244, 254, - 245, 254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, - 254, 0, 19, - 254, 0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97, - 254, 0, 99, 254, - 0, 101, 3, 1, 2, 25, 254, 27, 80, 254, 85, 254, 86, 254, 87, 249, 88, 250, - 90, 249, - 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 254, 219, - 254, - 220, 254, 221, 254, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 254, 0, 102, - 254, 0, - 108, 254, 0, 112, 254, 0, 114, 254, 0, 116, 254, 0, 122, 249, 34, 45, 247, - 46, 254, - 47, 247, 100, 254, 101, 254, 104, 254, 112, 254, 114, 254, 116, 254, 117, - 3, 119, - 2, 122, 2, 232, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, - 249, 254, - 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, 0, 19, 254, 0, 33, 254, 0, 37, - 254, 0, 79, 254, - 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, 99, 254, 0, 101, 3, 1, 2, 25, 254, - 27, 80, 254, - 85, 254, 86, 254, 87, 249, 88, 250, 90, 249, 211, 254, 212, 254, 213, 254, - 214, 254, - 215, 254, 217, 254, 218, 254, 219, 254, 220, 254, 221, 254, 222, 249, 0, - 78, 254, - 0, 82, 254, 0, 100, 254, 0, 102, 254, 0, 108, 254, 0, 112, 254, 0, 114, - 254, 0, 116, - 254, 0, 122, 249, 34, 45, 247, 46, 254, 47, 247, 100, 254, 101, 254, 104, - 254, 112, - 254, 114, 254, 116, 254, 117, 3, 119, 2, 122, 2, 232, 254, 243, 254, 244, - 254, 245, - 254, 246, 254, 247, 254, 249, 254, 254, 2, 0, 1, 2, 0, 9, 254, 0, 15, 254, - 0, 19, 254, - 0, 33, 254, 0, 37, 254, 0, 79, 254, 0, 83, 254, 0, 93, 254, 0, 97, 254, 0, - 99, 254, 0, - 101, 3, 1, 2, 25, 254, 2, 120, 254, 2, 120, 254, 2, 120, 254, 69, 45, 244, - 46, 237, - 47, 244, 59, 250, 60, 250, 66, 242, 80, 250, 98, 244, 102, 247, 112, 244, - 115, 244, - 118, 242, 120, 247, 122, 247, 193, 242, 194, 242, 195, 242, 196, 242, 197, - 242, - 198, 242, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, - 244, - 226, 244, 227, 244, 228, 244, 229, 244, 230, 244, 233, 247, 234, 247, 235, - 247, - 236, 247, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, - 242, - 251, 242, 252, 242, 253, 242, 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, - 0, 4, 242, - 0, 5, 244, 0, 6, 242, 0, 7, 244, 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, - 29, 247, 0, 78, - 250, 0, 79, 244, 0, 82, 250, 0, 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, - 242, 0, 113, - 242, 0, 115, 242, 0, 117, 242, 69, 45, 244, 46, 237, 47, 244, 59, 250, 60, - 250, 66, - 242, 80, 250, 98, 244, 102, 247, 112, 244, 115, 244, 118, 242, 120, 247, - 122, 247, - 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 250, 212, - 250, - 213, 250, 214, 250, 215, 250, 217, 250, 225, 244, 226, 244, 227, 244, 228, - 244, - 229, 244, 230, 244, 233, 247, 234, 247, 235, 247, 236, 247, 243, 244, 244, - 244, - 245, 244, 246, 244, 247, 244, 249, 244, 250, 242, 251, 242, 252, 242, 253, - 242, - 254, 247, 0, 1, 247, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, 244, 0, 6, - 242, 0, 7, 244, - 0, 21, 247, 0, 25, 247, 0, 27, 247, 0, 29, 247, 0, 78, 250, 0, 79, 244, 0, - 82, 250, 0, - 83, 244, 0, 87, 244, 0, 89, 244, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0, - 117, 242, - 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, - 197, 249, - 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, - 193, 249, - 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, - 6, 249, - 13, 45, 252, 47, 252, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, - 197, 249, - 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 13, 45, 252, 47, 252, 66, 249, - 193, 249, - 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, - 6, 249, - 61, 45, 240, 47, 240, 59, 249, 60, 249, 66, 239, 80, 245, 98, 242, 102, - 244, 112, - 240, 118, 240, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, - 211, - 245, 212, 245, 213, 245, 214, 245, 215, 245, 217, 245, 225, 242, 226, 242, - 227, - 242, 228, 242, 229, 242, 230, 242, 233, 244, 234, 244, 235, 244, 236, 244, - 243, - 240, 244, 240, 245, 240, 246, 240, 247, 240, 249, 240, 250, 240, 251, 240, - 252, - 240, 253, 240, 0, 2, 239, 0, 3, 242, 0, 4, 239, 0, 5, 242, 0, 6, 239, 0, - 7, 242, 0, 21, - 244, 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 78, 245, 0, 79, 240, 0, 82, - 245, 0, 83, 240, - 0, 109, 240, 0, 113, 240, 0, 115, 240, 0, 117, 240, 10, 102, 2, 233, 2, - 234, 2, 235, - 2, 236, 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2, - 234, 2, 235, 2, 236, - 2, 0, 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 10, 102, 2, 233, 2, 234, 2, - 235, 2, 236, 2, 0, - 21, 2, 0, 25, 2, 0, 27, 2, 0, 29, 2, 2, 120, 254, 2, 1, 32, 24, 249, 19, - 33, 244, 101, - 244, 109, 254, 115, 250, 116, 247, 119, 254, 0, 19, 244, 0, 60, 254, 0, - 62, 254, 0, - 68, 254, 0, 87, 250, 0, 89, 250, 0, 91, 250, 0, 93, 247, 0, 97, 247, 0, - 99, 247, 1, 2, - 25, 247, 1, 32, 25, 249, 2, 33, 244 -}; -static afm_cuint16 afm_Helvetica_BoldOblique_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Helvetica_BoldOblique_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Helvetica-Oblique */ -/* FullName: Helvetica Oblique */ -/* FamilyName: Helvetica */ -static afm_cuint8 afm_Helvetica_Oblique_widths[] = { /* 315 */ - 46, 46, 59, 93, 93, 148, 111, 32, 56, 56, 65, 97, 46, 56, 46, 46, 93, 93, - 93, 93, 93, - 93, 93, 93, 93, 93, 46, 46, 97, 97, 97, 93, 169, 111, 111, 120, 120, 111, - 102, 130, - 120, 46, 83, 111, 93, 139, 120, 130, 111, 130, 120, 111, 102, 120, 111, - 157, 111, - 111, 102, 46, 46, 46, 78, 93, 56, 93, 93, 83, 93, 93, 46, 93, 93, 37, 37, - 83, 37, 139, - 93, 93, 93, 93, 56, 83, 46, 93, 83, 120, 83, 83, 83, 56, 43, 56, 97, 56, - 93, 93, 93, - 93, 43, 93, 56, 123, 62, 93, 97, 123, 56, 67, 97, 56, 56, 56, 93, 90, 46, - 56, 56, 61, - 93, 139, 139, 139, 102, 111, 111, 111, 111, 111, 111, 167, 120, 111, 111, - 111, 111, - 46, 46, 46, 46, 120, 120, 130, 130, 130, 130, 130, 97, 130, 120, 120, 120, - 120, 111, - 111, 102, 93, 93, 93, 93, 93, 93, 148, 83, 93, 93, 93, 93, 46, 46, 46, 46, - 93, 93, 93, - 93, 93, 93, 93, 97, 102, 93, 93, 93, 93, 83, 93, 83, 111, 93, 111, 93, - 111, 93, 120, - 83, 120, 83, 120, 107, 120, 93, 111, 93, 111, 93, 111, 93, 111, 93, 130, - 93, 130, - 93, 46, 46, 46, 37, 46, 46, 111, 83, 93, 37, 93, 37, 93, 50, 93, 37, 120, - 93, 120, 93, - 120, 93, 130, 93, 130, 93, 167, 157, 120, 56, 120, 56, 120, 56, 111, 83, - 111, 83, - 111, 83, 102, 46, 102, 53, 120, 93, 120, 93, 120, 93, 120, 93, 111, 102, - 83, 102, - 83, 102, 83, 93, 111, 83, 56, 56, 56, 56, 56, 56, 56, 56, 93, 167, 37, 37, - 37, 56, 56, - 56, 93, 93, 58, 167, 167, 56, 56, 28, 93, 167, 79, 102, 100, 97, 76, 92, - 92, 92, 79, - 42, 83, 83 -}; -static afm_sint16 afm_Helvetica_Oblique_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 49, 52, 0, 0, - 0, 0, 0, 55, 170, 197, 202, 0, 241, 0, 0, 0, 345, 418, 510, 0, 0, 545, - 594, 687, 710, - 772, 777, 938, 966, 1115, 0, 1259, 0, 0, 0, 0, 0, 0, 0, 1407, 1419, 1468, - 0, 1476, - 1494, 1575, 1587, 0, 0, 1595, 0, 1638, 1668, 1700, 1718, 0, 1730, 1847, 0, - 0, 1854, - 1924, 1994, 2017, 2087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 2245, 2360, 2475, 2590, 2705, 0, - 2820, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 2825, 2874, 2923, 2972, 3021, 0, 3070, 3119, 3147, - 3175, 3203, - 3231, 0, 0, 3379, 3391, 3403, 3415, 3427, 3439, 0, 3451, 3459, 3477, 3495, - 3513, - 0, 0, 0, 0, 0, 3531, 3563, 3581, 3599, 3617, 3635, 0, 3653, 0, 0, 0, 0, - 3882, 0, 3952, - 4022, 4137, 4149, 4264, 4276, 4391, 4403, 4408, 4416, 4421, 4429, 0, 4468, - 0, - 0, 4507, 0, 4525, 0, 4543, 0, 4561, 0, 4579, 0, 4591, 0, 0, 0, 0, 0, 0, - 4603, 4695, - 4738, 0, 4773, 0, 4808, 0, 4843, 0, 0, 4878, 0, 4910, 0, 4942, 4974, 5023, - 5041, - 5090, 0, 0, 5108, 5170, 5287, 5349, 5466, 5528, 5645, 5650, 5657, 5662, - 5669, - 5674, 5681, 0, 5842, 0, 6003, 0, 6031, 0, 6059, 0, 6087, 0, 6115, 0, 6263, - 0, 6306, - 0, 6349, 0, 6392, 6397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6404, 6409, 0, 0, - 6447, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static afm_cuint8 afm_Helvetica_Oblique_kerning_data[] = { /* 6450 */ - 42, 11, 85, 249, 87, 249, 88, 250, 90, 242, 222, 242, 0, 100, 249, 0, 102, - 249, 0, - 122, 242, 1, 32, 24, 247, 1, 32, 28, 252, 3, 1, 32, 25, 240, 1, 32, 29, - 240, 4, 33, 247, - 1, 32, 25, 240, 1, 32, 29, 240, 2, 33, 249, 2, 33, 249, 49, 68, 252, 72, - 252, 80, 252, - 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250, - 120, 250, - 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, - 252, - 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252, - 252, - 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36, - 252, 0, 78, - 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0, - 112, 249, 0, - 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240, - 12, 45, - 254, 47, 254, 86, 255, 218, 255, 219, 255, 220, 255, 221, 255, 0, 108, - 255, 0, 112, - 255, 0, 114, 255, 0, 116, 255, 3, 45, 252, 47, 252, 18, 45, 245, 47, 245, - 66, 250, - 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250, 196, 250, 197, - 250, 198, - 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 242, 45, 45, 232, - 47, 232, 66, - 244, 98, 249, 102, 252, 112, 252, 115, 249, 193, 244, 194, 244, 195, 244, - 196, 244, - 197, 244, 198, 244, 225, 249, 226, 249, 227, 249, 228, 249, 229, 249, 230, - 249, - 233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246, - 252, - 247, 252, 249, 252, 0, 2, 244, 0, 3, 249, 0, 4, 244, 0, 5, 249, 0, 6, 244, - 0, 7, 249, - 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79, 252, 0, 83, 252, 0, - 87, 249, 0, - 89, 249, 0, 91, 249, 32, 45, 252, 47, 252, 66, 254, 98, 254, 118, 254, - 193, 254, 194, - 254, 195, 254, 196, 254, 197, 254, 198, 254, 225, 254, 226, 254, 227, 254, - 228, - 254, 229, 254, 230, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 2, - 254, 0, 3, - 254, 0, 4, 254, 0, 5, 254, 0, 6, 254, 0, 7, 254, 0, 109, 254, 0, 113, 254, - 0, 115, 254, - 0, 117, 254, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211, - 249, 212, - 249, 213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250, - 236, - 250, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252, - 251, - 252, 252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0, - 27, 250, 0, - 29, 250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0, - 113, 252, 0, - 115, 252, 0, 117, 252, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, - 222, 234, - 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, - 230, 1, 32, 29, - 234, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, - 90, 245, 193, - 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, - 254, 0, 4, - 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 41, 45, 227, 47, - 227, 66, 237, - 98, 250, 102, 249, 112, 249, 193, 237, 194, 237, 195, 237, 196, 237, 197, - 237, 198, - 237, 225, 250, 226, 250, 227, 250, 228, 250, 229, 250, 230, 250, 233, 249, - 234, - 249, 235, 249, 236, 249, 243, 249, 244, 249, 245, 249, 246, 249, 247, 249, - 249, - 249, 0, 2, 237, 0, 3, 250, 0, 4, 237, 0, 5, 250, 0, 6, 237, 0, 7, 250, 0, - 21, 249, 0, 25, - 249, 0, 27, 249, 0, 29, 249, 0, 79, 249, 0, 83, 249, 10, 86, 255, 218, - 255, 219, 255, - 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, - 27, 80, 254, - 85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254, - 214, 254, - 215, 254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0, - 78, 254, - 0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, - 250, 0, 116, - 250, 0, 122, 249, 3, 45, 254, 47, 254, 70, 45, 237, 46, 234, 47, 237, 59, - 254, 60, - 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237, - 120, 237, - 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227, - 237, - 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243, - 237, - 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252, - 237, - 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247, - 0, 6, 237, - 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0, - 79, 247, 0, - 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0, - 113, 237, 0, - 115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, - 195, 250, - 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45, - 236, 46, 244, - 47, 236, 59, 250, 60, 250, 66, 244, 72, 250, 80, 250, 98, 245, 102, 244, - 112, 244, - 118, 245, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 245, 226, 245, 227, - 245, - 228, 245, 229, 245, 230, 245, 233, 244, 234, 244, 235, 244, 236, 244, 243, - 244, - 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 245, 251, 245, 252, - 245, - 253, 245, 0, 2, 244, 0, 3, 245, 0, 4, 244, 0, 5, 245, 0, 6, 244, 0, 7, - 245, 0, 21, 244, - 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 32, 250, 0, 36, 250, 0, 78, 250, 0, - 79, 244, 0, - 82, 250, 0, 83, 244, 0, 109, 245, 0, 113, 245, 0, 115, 245, 0, 117, 245, - 63, 45, 244, - 46, 250, 47, 244, 66, 249, 80, 254, 98, 250, 102, 252, 112, 252, 118, 252, - 122, 254, - 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 211, 254, 212, - 254, - 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 250, 227, 250, 228, - 250, - 229, 250, 230, 250, 233, 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, - 252, - 245, 252, 246, 252, 247, 252, 249, 252, 250, 252, 251, 252, 252, 252, 253, - 252, - 254, 254, 0, 1, 254, 0, 2, 249, 0, 3, 250, 0, 4, 249, 0, 5, 250, 0, 6, - 249, 0, 7, 250, - 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 78, 254, 0, 79, 252, 0, - 82, 254, 0, - 83, 252, 0, 109, 252, 0, 113, 252, 0, 115, 252, 0, 117, 252, 65, 45, 234, - 46, 234, - 47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234, 106, 254, - 112, 234, - 118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, - 243, - 212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226, 234, 227, - 234, - 228, 234, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236, 234, 238, - 254, - 243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250, 239, 251, - 239, - 252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245, 0, 6, 239, - 0, 7, 234, - 0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0, 78, 243, 0, - 79, 234, 0, - 82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0, 117, 239, - 6, 119, 254, - 120, 254, 122, 252, 254, 252, 0, 1, 252, 21, 45, 250, 47, 250, 99, 255, - 109, 254, - 118, 254, 119, 254, 122, 254, 250, 254, 251, 254, 252, 254, 253, 254, 254, - 254, - 0, 1, 254, 0, 60, 254, 0, 62, 254, 0, 68, 254, 0, 109, 254, 0, 113, 254, - 0, 115, 254, - 0, 117, 254, 4, 45, 254, 108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119, - 252, 120, - 254, 121, 252, 122, 254, 254, 254, 0, 1, 254, 34, 45, 252, 47, 252, 98, - 252, 102, - 252, 112, 252, 225, 252, 226, 252, 227, 252, 228, 252, 229, 252, 230, 252, - 233, - 252, 234, 252, 235, 252, 236, 252, 243, 252, 244, 252, 245, 252, 246, 252, - 247, - 252, 249, 252, 0, 3, 252, 0, 5, 252, 0, 7, 252, 0, 21, 252, 0, 25, 252, 0, - 27, 252, 0, - 29, 252, 0, 51, 252, 0, 79, 252, 0, 83, 252, 1, 32, 25, 8, 1, 32, 29, 10, - 5, 115, 255, - 0, 87, 255, 0, 89, 255, 0, 91, 255, 4, 122, 252, 254, 252, 0, 1, 252, 19, - 102, 254, - 112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, - 254, - 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, - 254, 0, 79, - 254, 0, 83, 254, 13, 118, 255, 122, 254, 250, 255, 251, 255, 252, 255, - 253, 255, - 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, - 14, 118, 255, - 119, 254, 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, - 1, 254, - 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, 117, 255, 9, 45, 250, 47, 250, - 119, 254, - 120, 254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 6, 45, 251, 47, 251, - 122, 252, - 254, 252, 0, 1, 252, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3, - 108, 3, 109, - 3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226, - 255, 227, - 255, 228, 255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4, - 250, 3, - 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255, - 0, 45, 3, 0, 49, - 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4, - 0, 101, 7, 0, 109, - 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 4, 45, 254, 47, 254, 120, 252, 31, 45, - 244, 47, 244, - 98, 253, 102, 253, 112, 253, 225, 253, 226, 253, 227, 253, 228, 253, 229, - 253, 230, - 253, 233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244, 253, 245, 253, - 246, - 253, 247, 253, 249, 253, 0, 3, 253, 0, 5, 253, 0, 7, 253, 0, 21, 253, 0, - 25, 253, 0, - 27, 253, 0, 29, 253, 0, 79, 253, 0, 83, 253, 31, 45, 247, 47, 247, 98, - 254, 102, 255, - 112, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233, - 255, - 234, 255, 235, 255, 236, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247, - 255, - 249, 255, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 255, 0, 25, 255, 0, 27, - 255, 0, 29, - 255, 0, 79, 255, 0, 83, 255, 10, 102, 252, 233, 252, 234, 252, 235, 252, - 236, 252, - 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 31, 45, 240, 47, 240, 98, - 254, 102, - 254, 112, 254, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, - 233, - 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, - 247, - 254, 249, 254, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, - 27, 254, 0, - 29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112, 254, 233, 254, 234, - 254, 235, - 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, - 0, 21, - 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 49, 68, - 252, 72, 252, - 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, - 119, 250, - 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, - 252, - 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, - 252, 0, 36, 252, - 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, - 252, 0, 112, - 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, - 122, 240, - 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, - 249, 90, 240, - 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, - 252, - 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 240, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, - 14, 252, - 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, - 249, 87, 245, - 88, 249, 90, 240, 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, - 252, 212, - 252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 240, 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, - 250, 0, 8, - 252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, - 237, 0, 102, - 237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, - 115, 252, - 0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68, 252, 72, 252, 80, 252, 82, - 252, 85, - 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, 250, 120, 250, - 122, 250, - 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 218, - 249, - 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, 252, 252, 253, - 252, - 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, 36, 252, 0, 78, - 252, 0, 82, - 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, - 113, 252, - 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 240, 49, 68, - 252, 72, 252, - 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, - 119, 250, - 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, - 252, - 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, - 252, 0, 36, 252, - 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, - 252, 0, 112, - 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, - 122, 240, - 49, 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, - 249, 90, 240, - 118, 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, - 252, - 214, 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, - 240, - 250, 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, - 14, 252, - 0, 32, 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, - 0, 108, 249, - 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, - 249, 0, 117, - 252, 0, 122, 240, 3, 45, 252, 47, 252, 22, 45, 250, 47, 250, 66, 254, 85, - 250, 87, - 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, - 197, 254, - 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, - 250, 0, 122, - 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, - 90, 245, 193, - 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, - 254, 0, 4, - 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, - 250, 66, 254, - 85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, - 196, 254, - 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, - 250, 0, 102, - 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, - 252, 89, 247, - 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, - 245, 0, - 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 22, - 45, 250, 47, - 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, - 254, 195, - 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, - 254, 0, 100, - 250, 0, 102, 250, 0, 122, 245, 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, - 249, 88, - 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, - 198, 254, - 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, - 122, 245, 13, - 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, - 250, 198, - 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, - 250, 194, - 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, - 250, 13, 45, - 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, - 198, 250, - 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250, - 194, 250, - 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, - 65, 45, 234, - 46, 234, 47, 234, 59, 247, 60, 247, 66, 239, 80, 243, 98, 234, 102, 234, - 106, 254, - 112, 234, 118, 239, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, - 239, - 211, 243, 212, 243, 213, 243, 214, 243, 215, 243, 217, 243, 225, 234, 226, - 234, - 227, 234, 228, 245, 229, 234, 230, 234, 233, 234, 234, 234, 235, 234, 236, - 234, - 238, 254, 243, 234, 244, 234, 245, 234, 246, 234, 247, 234, 249, 234, 250, - 239, - 251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3, 245, 0, 4, 239, 0, 5, 245, - 0, 6, 239, - 0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234, 0, 29, 234, 0, 49, 254, 0, - 78, 243, 0, - 79, 245, 0, 82, 243, 0, 83, 234, 0, 109, 239, 0, 113, 239, 0, 115, 239, 0, - 117, 239, - 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, - 254, 122, - 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, - 252, 6, - 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, - 122, 252, - 254, 252, 0, 1, 252, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, - 4, 45, 254, - 108, 254, 0, 57, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 9, 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, - 122, 254, - 254, 254, 0, 1, 254, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255, - 252, 255, - 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, - 117, 255, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, 254, 252, 0, - 1, 252, - 95, 45, 241, 47, 241, 98, 248, 99, 248, 100, 248, 101, 248, 102, 248, 103, - 248, 104, - 248, 105, 248, 106, 248, 107, 248, 108, 248, 109, 248, 110, 248, 111, 248, - 112, - 248, 113, 248, 114, 248, 115, 248, 116, 248, 117, 248, 118, 248, 119, 245, - 120, - 245, 121, 243, 122, 245, 123, 248, 225, 248, 226, 248, 227, 248, 228, 248, - 229, - 248, 230, 248, 232, 248, 233, 248, 234, 248, 235, 248, 236, 248, 237, 248, - 238, - 248, 239, 248, 240, 248, 242, 248, 243, 248, 244, 248, 245, 248, 246, 248, - 247, - 248, 249, 248, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0, 1, - 245, 0, 3, - 248, 0, 5, 248, 0, 7, 248, 0, 9, 248, 0, 15, 248, 0, 19, 248, 0, 21, 248, - 0, 25, 248, - 0, 27, 248, 0, 29, 248, 0, 33, 248, 0, 37, 248, 0, 45, 248, 0, 49, 248, 0, - 57, 248, 0, - 60, 248, 0, 62, 248, 0, 68, 248, 0, 70, 248, 0, 72, 248, 0, 74, 248, 0, - 79, 248, 0, 83, - 248, 0, 87, 248, 0, 89, 248, 0, 91, 248, 0, 93, 248, 0, 97, 248, 0, 99, - 248, 0, 101, - 248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, 117, 248, 0, 124, 248, 0, - 126, 248, - 0, 128, 248, 1, 2, 25, 248, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112, - 254, 225, - 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254, - 235, - 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, - 0, 3, - 254, 0, 5, 254, 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, - 0, 79, 254, - 0, 83, 254, 31, 45, 240, 47, 240, 98, 254, 102, 254, 112, 254, 225, 254, - 226, 254, - 227, 254, 228, 254, 229, 254, 230, 254, 233, 254, 234, 254, 235, 254, 236, - 254, - 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 3, 254, 0, - 5, 254, - 0, 7, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, - 83, 254, 49, - 68, 252, 72, 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, - 90, 240, 118, - 252, 119, 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, - 214, - 252, 215, 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, - 250, - 252, 251, 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, - 252, 0, 32, - 252, 0, 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, - 249, 0, 109, - 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, - 117, 252, - 0, 122, 240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68, - 252, 72, - 252, 80, 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, - 252, 119, - 250, 120, 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, - 215, - 252, 217, 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, - 251, - 252, 252, 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, - 32, 252, 0, - 36, 252, 0, 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, - 109, 252, - 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, - 252, 0, 122, - 240, 6, 119, 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 49, 68, 252, - 72, 252, 80, - 252, 82, 252, 85, 237, 86, 249, 87, 245, 88, 249, 90, 240, 118, 252, 119, - 250, 120, - 250, 122, 250, 200, 252, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, - 217, - 252, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 252, 251, 252, - 252, - 252, 253, 252, 254, 250, 0, 1, 250, 0, 8, 252, 0, 14, 252, 0, 32, 252, 0, - 36, 252, 0, - 78, 252, 0, 82, 252, 0, 100, 237, 0, 102, 237, 0, 108, 249, 0, 109, 252, - 0, 112, 249, - 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, - 240, 6, 119, - 254, 120, 254, 122, 252, 254, 252, 0, 1, 252, 3, 45, 252, 47, 252, 4, 45, - 254, 108, - 254, 0, 57, 254, 3, 45, 252, 47, 252, 4, 45, 254, 108, 254, 0, 57, 254, - 18, 45, 245, - 47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, 250, - 196, 250, - 197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, - 242, 18, 45, - 245, 47, 245, 66, 250, 87, 245, 88, 250, 90, 242, 193, 250, 194, 250, 195, - 250, 196, - 250, 197, 250, 198, 250, 222, 242, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, - 122, 242, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 9, - 45, 254, 47, 254, 119, 252, 120, 254, 121, 252, 122, 254, 254, 254, 0, 1, - 254, 5, - 115, 255, 0, 87, 255, 0, 89, 255, 0, 91, 255, 5, 115, 255, 0, 87, 255, 0, - 89, 255, 0, - 91, 255, 40, 80, 249, 102, 250, 112, 250, 118, 252, 122, 249, 211, 249, - 212, 249, - 213, 249, 214, 249, 215, 249, 217, 249, 233, 250, 234, 250, 235, 250, 236, - 250, - 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 252, 251, - 252, - 252, 252, 253, 252, 254, 249, 0, 1, 249, 0, 21, 250, 0, 25, 250, 0, 27, - 250, 0, 29, - 250, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, 109, 252, 0, 113, - 252, 0, 115, - 252, 0, 117, 252, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235, 254, - 236, 254, - 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, - 25, 254, - 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 14, 85, 239, 87, 239, 88, - 245, 90, 234, - 122, 252, 222, 234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, - 234, 1, - 32, 25, 230, 1, 32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, - 252, 222, - 234, 254, 252, 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, - 25, 230, 1, - 32, 29, 234, 14, 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234, - 254, 252, - 0, 1, 252, 0, 100, 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32, - 29, 234, 14, - 85, 239, 87, 239, 88, 245, 90, 234, 122, 252, 222, 234, 254, 252, 0, 1, - 252, 0, 100, - 239, 0, 102, 239, 0, 122, 234, 1, 32, 25, 230, 1, 32, 29, 234, 14, 118, - 255, 119, 254, - 122, 254, 250, 255, 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, - 109, 255, - 0, 113, 255, 0, 115, 255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254, - 250, 255, - 251, 255, 252, 255, 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, - 255, 0, 115, - 255, 0, 117, 255, 14, 118, 255, 119, 254, 122, 254, 250, 255, 251, 255, - 252, 255, - 253, 255, 254, 254, 0, 1, 254, 0, 109, 255, 0, 113, 255, 0, 115, 255, 0, - 117, 255, - 22, 45, 250, 47, 250, 66, 254, 85, 250, 87, 249, 88, 252, 89, 247, 90, - 245, 193, 254, - 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 222, 245, 0, 2, 254, 0, - 4, 254, - 0, 6, 254, 0, 100, 250, 0, 102, 250, 0, 122, 245, 9, 45, 250, 47, 250, - 119, 254, 120, - 254, 121, 252, 122, 252, 254, 252, 0, 1, 252, 22, 45, 250, 47, 250, 66, - 254, 85, 250, - 87, 249, 88, 252, 89, 247, 90, 245, 193, 254, 194, 254, 195, 254, 196, - 254, 197, - 254, 198, 254, 222, 245, 0, 2, 254, 0, 4, 254, 0, 6, 254, 0, 100, 250, 0, - 102, 250, - 0, 122, 245, 9, 45, 250, 47, 250, 119, 254, 120, 254, 121, 252, 122, 252, - 254, 252, - 0, 1, 252, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252, 90, 249, 211, - 254, 212, - 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250, 220, 250, - 221, - 250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252, 0, 108, - 250, 0, 112, - 250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47, 249, 59, 5, - 60, 5, 98, - 255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, - 5, 122, 5, - 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, 237, 3, 238, - 3, 239, - 3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, - 255, 0, 5, 255, - 0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, - 70, 4, 0, 72, 4, - 0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, 27, 80, - 254, 85, 252, - 86, 250, 87, 249, 88, 252, 90, 249, 211, 254, 212, 254, 213, 254, 214, - 254, 215, - 254, 217, 254, 218, 250, 219, 250, 220, 250, 221, 250, 222, 249, 0, 78, - 254, 0, 82, - 254, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, - 116, 250, - 0, 122, 249, 50, 45, 249, 47, 249, 59, 5, 60, 5, 98, 255, 106, 3, 108, 3, - 109, 3, 110, - 4, 111, 4, 113, 5, 117, 7, 118, 3, 119, 5, 122, 5, 225, 255, 226, 255, - 227, 255, 228, - 255, 229, 255, 230, 255, 237, 3, 238, 3, 239, 3, 240, 3, 242, 4, 250, 3, - 251, 3, 252, - 3, 253, 3, 254, 5, 0, 1, 5, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 45, 3, 0, - 49, 3, 0, 57, 3, - 0, 60, 3, 0, 62, 3, 0, 68, 3, 0, 70, 4, 0, 72, 4, 0, 74, 4, 0, 101, 7, 0, - 109, 3, 0, 113, - 3, 0, 115, 3, 0, 117, 3, 27, 80, 254, 85, 252, 86, 250, 87, 249, 88, 252, - 90, 249, 211, - 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 218, 250, 219, 250, - 220, - 250, 221, 250, 222, 249, 0, 78, 254, 0, 82, 254, 0, 100, 252, 0, 102, 252, - 0, 108, - 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 249, 50, 45, 249, 47, - 249, 59, - 5, 60, 5, 98, 255, 106, 3, 108, 3, 109, 3, 110, 4, 111, 4, 113, 5, 117, 7, - 118, 3, 119, - 5, 122, 5, 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, - 237, 3, 238, - 3, 239, 3, 240, 3, 242, 4, 250, 3, 251, 3, 252, 3, 253, 3, 254, 5, 0, 1, - 5, 0, 3, 255, - 0, 5, 255, 0, 7, 255, 0, 45, 3, 0, 49, 3, 0, 57, 3, 0, 60, 3, 0, 62, 3, 0, - 68, 3, 0, 70, 4, - 0, 72, 4, 0, 74, 4, 0, 101, 7, 0, 109, 3, 0, 113, 3, 0, 115, 3, 0, 117, 3, - 3, 45, 254, 47, - 254, 4, 45, 254, 47, 254, 120, 252, 3, 45, 254, 47, 254, 4, 45, 254, 47, - 254, 120, - 252, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254, 120, 252, 70, 45, 237, 46, - 234, 47, - 237, 59, 254, 60, 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, - 237, 118, - 237, 120, 237, 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, - 198, - 237, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, - 226, - 237, 227, 237, 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, - 236, - 237, 243, 237, 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, - 251, - 237, 252, 237, 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, - 237, 0, 5, - 247, 0, 6, 237, 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, - 0, 78, 250, - 0, 79, 247, 0, 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, - 109, 247, - 0, 113, 237, 0, 115, 237, 0, 117, 237, 70, 45, 237, 46, 234, 47, 237, 59, - 254, 60, - 254, 66, 237, 80, 250, 98, 237, 102, 237, 112, 237, 115, 237, 118, 237, - 120, 237, - 122, 237, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, - 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 225, 237, 226, 237, 227, - 237, - 228, 247, 229, 237, 230, 237, 233, 247, 234, 237, 235, 237, 236, 237, 243, - 237, - 244, 237, 245, 237, 246, 247, 247, 237, 249, 237, 250, 237, 251, 237, 252, - 237, - 253, 237, 254, 237, 0, 1, 247, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 247, - 0, 6, 237, - 0, 7, 237, 0, 21, 247, 0, 25, 237, 0, 27, 237, 0, 29, 237, 0, 78, 250, 0, - 79, 247, 0, - 82, 250, 0, 83, 237, 0, 87, 237, 0, 89, 237, 0, 91, 237, 0, 109, 247, 0, - 113, 237, 0, - 115, 237, 0, 117, 237, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, - 195, 250, - 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, - 250, 47, 250, - 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, - 250, 0, - 4, 250, 0, 6, 250, 13, 45, 250, 47, 250, 66, 250, 193, 250, 194, 250, 195, - 250, 196, - 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 250, 47, - 250, 66, - 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, - 250, 0, 4, - 250, 0, 6, 250, 65, 45, 234, 46, 234, 47, 234, 59, 247, 60, 247, 66, 239, - 80, 243, - 98, 234, 102, 234, 106, 254, 112, 234, 118, 239, 193, 239, 194, 239, 195, - 239, 196, - 239, 197, 239, 198, 239, 211, 243, 212, 243, 213, 243, 214, 243, 215, 243, - 217, - 243, 225, 234, 226, 234, 227, 234, 228, 245, 229, 234, 230, 234, 233, 234, - 234, - 234, 235, 234, 236, 234, 238, 254, 243, 234, 244, 234, 245, 234, 246, 234, - 247, - 234, 249, 234, 250, 239, 251, 239, 252, 239, 253, 239, 0, 2, 239, 0, 3, - 245, 0, 4, - 239, 0, 5, 245, 0, 6, 239, 0, 7, 234, 0, 21, 245, 0, 25, 234, 0, 27, 234, - 0, 29, 234, - 0, 49, 254, 0, 78, 243, 0, 79, 234, 0, 82, 243, 0, 83, 234, 0, 109, 239, - 0, 113, 239, - 0, 115, 239, 0, 117, 239, 19, 102, 254, 112, 254, 233, 254, 234, 254, 235, - 254, 236, - 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, - 254, 0, 25, - 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 19, 102, 254, 112, - 254, 233, 254, - 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, - 254, - 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, - 83, 254, 19, - 102, 254, 112, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, 244, - 254, - 245, 254, 246, 254, 247, 254, 249, 254, 0, 21, 254, 0, 25, 254, 0, 27, - 254, 0, 29, - 254, 0, 79, 254, 0, 83, 254, 3, 45, 254, 47, 254, 4, 45, 254, 47, 254, - 120, 252, 2, - 1, 32, 24, 247, 14, 33, 245, 101, 249, 115, 249, 116, 249, 0, 19, 249, 0, - 87, 249, - 0, 89, 249, 0, 91, 249, 0, 93, 249, 0, 97, 249, 0, 99, 249, 1, 2, 25, 249, - 1, 32, 25, - 247, 2, 33, 250 -}; -static afm_cuint16 afm_Helvetica_Oblique_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Helvetica_Oblique_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: ZapfDingbats */ -/* FullName: ITC Zapf Dingbats */ -/* FamilyName: ZapfDingbats */ -static afm_cuint8 afm_ZapfDingbats_widths[] = { /* 202 */ - 46, 162, 160, 162, 163, 120, 132, 132, 132, 115, 160, 157, 92, 143, 152, - 156, 152, - 158, 162, 126, 141, 127, 127, 95, 113, 127, 127, 127, 126, 82, 92, 90, 96, - 115, 131, - 131, 131, 132, 132, 132, 136, 137, 132, 140, 137, 139, 136, 139, 154, 124, - 121, - 125, 132, 132, 116, 129, 128, 132, 127, 118, 118, 114, 117, 138, 136, 132, - 132, - 118, 115, 116, 115, 131, 131, 119, 132, 131, 132, 146, 127, 127, 127, 127, - 127, - 149, 149, 131, 131, 73, 23, 46, 69, 65, 65, 111, 111, 65, 65, 53, 53, 46, - 46, 85, 85, - 68, 68, 39, 39, 56, 56, 122, 91, 91, 152, 111, 127, 127, 129, 99, 116, - 104, 131, 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, - 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, - 131, 131, 131, 131, 131, 131, 149, 140, 169, 76, 125, 154, 125, 153, 155, - 155, 155, - 139, 146, 138, 154, 154, 153, 155, 155, 77, 147, 139, 139, 145, 145, 116, - 116, 146, - 146, 127, 158, 129, 144, 129, 148, 161, 148, 139, 146, 155, 162, 153 -}; -static afm_cuint16 afm_ZapfDingbats_highchars_index[] = { /* 107 */ - 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 161, - 162, - 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, - 178, - 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, - 194, - 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, - 210, - 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, - 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 241, 242, - 243, - 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Symbol */ -/* FullName: Symbol */ -/* FamilyName: Symbol */ -static afm_cuint8 afm_Symbol_widths[] = { /* 251 */ - 42, 56, 0, 83, 0, 139, 130, 0, 56, 56, 0, 92, 42, 0, 42, 46, 83, 83, 83, - 83, 83, 83, 83, - 83, 83, 83, 46, 46, 92, 92, 92, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 56, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 33, 80, 0, 119, 67, 92, 96, 92, 92, 83, - 120, 111, 101, 102, - 102, 120, 124, 56, 120, 114, 148, 120, 108, 120, 128, 93, 99, 102, 115, - 127, 120, - 133, 105, 92, 69, 82, 73, 82, 101, 87, 55, 92, 92, 87, 82, 92, 92, 92, 73, - 101, 73, - 96, 87, 92, 114, 114, 105, 103, 101, 119, 77, 167, 41, 69, 28, 125, 114, - 165, 133, - 128, 137, 165, 101, 165, 101, 174, 110, 165, 101, 165, 101, 174, 119, 82, - 92, 137, - 102, 119, 119, 119, 73, 137, 119, 92, 83, 92, 119, 119, 128, 101, 101, - 128, 128, - 46, 144, 92, 92, 92, 92, 92, 92, 92, 119, 119, 119, 119, 119, 128, 128, - 110, 42, 114, - 114, 55, 55, 82, 126, 126, 126, 126, 132, 132, 148, 83, 101, 167, 132, - 132, 131, - 64, 64, 64, 64, 64, 64, 82, 82, 82, 82, 114, 64, 64, 64, 64, 64, 64, 82, - 82, 82 -}; -static afm_cuint16 afm_Symbol_highchars_index[] = { /* 156 */ - 172, 176, 177, 181, 215, 247, 402, 913, 914, 915, 917, 918, 919, 920, 921, - 922, - 923, 924, 925, 926, 927, 928, 929, 931, 932, 933, 934, 935, 936, 945, 946, - 947, - 948, 949, 950, 951, 952, 953, 954, 955, 957, 958, 959, 960, 961, 962, 963, - 964, - 965, 966, 967, 968, 969, 977, 978, 981, 982, 8226, 8230, 8242, 8243, 8260, - 8364, - 8465, 8472, 8476, 8486, 8501, 8592, 8593, 8594, 8595, 8596, 8629, 8656, - 8657, - 8658, 8659, 8660, 8704, 8706, 8707, 8709, 8710, 8711, 8712, 8713, 8715, - 8719, - 8721, 8722, 8727, 8730, 8733, 8734, 8736, 8743, 8744, 8745, 8746, 8747, - 8756, - 8764, 8773, 8776, 8800, 8801, 8804, 8805, 8834, 8835, 8836, 8838, 8839, - 8853, - 8855, 8869, 8901, 8992, 8993, 9001, 9002, 9674, 9824, 9827, 9829, 9830, - 63193, - 63194, 63195, 63717, 63718, 63719, 63720, 63721, 63722, 63723, 63724, - 63725, - 63726, 63727, 63728, 63729, 63730, 63731, 63732, 63733, 63734, 63735, - 63736, - 63737, 63738, 63739, 63740, 63741, 63742 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Times-Bold */ -/* FullName: Times Bold */ -/* FamilyName: Times */ -static afm_cuint8 afm_Times_Bold_widths[] = { /* 315 */ - 42, 56, 93, 83, 83, 167, 139, 46, 56, 56, 83, 95, 42, 56, 42, 46, 83, 83, - 83, 83, 83, - 83, 83, 83, 83, 83, 56, 56, 95, 95, 95, 83, 155, 120, 111, 120, 120, 111, - 102, 130, - 130, 65, 83, 130, 111, 157, 120, 130, 102, 130, 120, 93, 111, 120, 120, - 167, 120, - 120, 111, 56, 46, 56, 97, 83, 56, 83, 93, 74, 93, 74, 56, 83, 93, 46, 56, - 93, 46, 139, - 93, 83, 93, 93, 74, 65, 56, 93, 83, 120, 83, 83, 74, 66, 37, 66, 87, 56, - 83, 83, 83, - 83, 37, 83, 56, 125, 50, 83, 95, 125, 56, 67, 95, 50, 50, 56, 93, 90, 42, - 56, 50, 55, - 83, 125, 125, 125, 83, 120, 120, 120, 120, 120, 120, 167, 120, 111, 111, - 111, 111, - 65, 65, 65, 65, 120, 120, 130, 130, 130, 130, 130, 95, 130, 120, 120, 120, - 120, 120, - 102, 93, 83, 83, 83, 83, 83, 83, 120, 74, 74, 74, 74, 74, 46, 46, 46, 46, - 83, 93, 83, - 83, 83, 83, 83, 95, 83, 93, 93, 93, 93, 83, 93, 83, 120, 83, 120, 83, 120, - 83, 120, - 74, 120, 74, 120, 112, 120, 93, 111, 74, 111, 74, 111, 74, 111, 74, 130, - 83, 130, - 83, 65, 46, 65, 46, 65, 46, 130, 93, 111, 46, 111, 46, 111, 66, 111, 46, - 120, 93, 120, - 93, 120, 93, 130, 83, 130, 83, 167, 120, 120, 74, 120, 74, 120, 74, 93, - 65, 93, 65, - 93, 65, 111, 56, 111, 69, 120, 93, 120, 93, 120, 93, 120, 93, 120, 111, - 74, 111, 74, - 111, 74, 83, 93, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 167, 56, 56, 56, - 83, 83, 83, - 83, 83, 58, 167, 167, 56, 56, 28, 83, 167, 82, 102, 100, 95, 92, 92, 92, - 92, 82, 42, - 93, 93 -}; -static afm_sint16 afm_Times_Bold_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 62, 183, 0, 229, 0, 266, 0, 0, 0, 359, 472, 564, 0, 599, 623, 668, - 761, 786, 0, - 848, 1016, 1044, 1209, 0, 1364, 0, 0, 0, 0, 0, 0, 0, 1512, 1515, 0, 1544, - 1547, 1550, - 1588, 1591, 1599, 0, 1602, 0, 0, 1652, 1655, 0, 0, 1660, 0, 0, 0, 1746, - 1816, 0, 1841, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1888, 2009, 2130, 2251, 2372, 2493, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2614, 2638, - 2683, 2728, 2773, 2818, 0, 2863, 2908, 2936, 2964, 2992, 3020, 0, 0, 3168, - 3171, - 3174, 3177, 3180, 3183, 0, 0, 3186, 3189, 3192, 3195, 3198, 3201, 3204, - 3207, - 0, 3210, 3213, 3218, 3223, 3228, 3233, 0, 3238, 0, 0, 0, 0, 3243, 0, 3290, - 3337, - 3458, 3461, 3582, 3585, 3706, 0, 0, 0, 0, 3709, 0, 3746, 3783, 0, 3786, 0, - 3789, - 0, 3792, 0, 3795, 0, 3798, 0, 3801, 0, 3804, 0, 3807, 0, 0, 3810, 3902, - 3952, 0, 3987, - 0, 0, 0, 4022, 0, 4057, 4081, 4084, 4108, 4111, 4135, 4138, 4183, 4188, - 4233, 0, - 0, 4238, 4300, 4386, 4448, 4534, 4596, 0, 0, 0, 0, 0, 0, 4682, 0, 4850, 0, - 5018, 0, - 5046, 0, 5074, 0, 5102, 0, 5130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 5278, 5306, 0, 5346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 -}; -static afm_cuint8 afm_Times_Bold_kerning_data[] = { /* 5370 */ - 42, 19, 66, 248, 85, 252, 87, 249, 88, 252, 90, 248, 193, 248, 194, 248, - 195, 248, - 196, 248, 197, 248, 198, 248, 222, 248, 0, 2, 248, 0, 4, 248, 0, 6, 248, - 0, 100, 252, - 0, 102, 252, 0, 122, 248, 3, 1, 32, 25, 248, 1, 32, 29, 249, 3, 1, 32, 25, - 248, 1, 32, - 29, 248, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87, - 233, 88, 235, - 90, 240, 113, 253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211, - 249, 212, - 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, - 245, 0, 8, - 248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100, - 241, 0, 102, - 241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0, - 115, 249, - 0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 20, 66, 252, 86, - 255, 193, 252, - 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 218, 255, 219, 255, 220, - 255, - 221, 255, 0, 2, 252, 0, 4, 252, 0, 6, 252, 0, 108, 255, 0, 112, 255, 0, - 114, 255, 0, - 116, 255, 17, 47, 254, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194, - 251, 195, - 251, 196, 251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6, - 251, 0, 122, - 250, 41, 45, 242, 47, 239, 66, 242, 98, 253, 102, 253, 112, 253, 193, 242, - 194, 242, - 195, 242, 196, 242, 197, 242, 198, 242, 225, 253, 226, 253, 227, 253, 228, - 253, - 229, 253, 230, 253, 233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244, - 253, - 245, 253, 246, 253, 247, 253, 249, 253, 0, 2, 242, 0, 3, 253, 0, 4, 242, - 0, 5, 253, - 0, 6, 242, 0, 7, 253, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0, - 79, 253, 0, 83, - 253, 49, 47, 254, 66, 252, 98, 254, 102, 254, 112, 254, 118, 254, 193, - 252, 194, - 252, 195, 252, 196, 252, 197, 252, 198, 252, 225, 254, 226, 254, 227, 254, - 228, - 254, 229, 254, 230, 254, 233, 254, 234, 254, 235, 254, 236, 254, 243, 254, - 244, - 254, 245, 254, 246, 254, 247, 254, 249, 254, 250, 254, 251, 254, 252, 254, - 253, - 254, 0, 2, 252, 0, 3, 254, 0, 4, 252, 0, 5, 254, 0, 6, 252, 0, 7, 254, 0, - 21, 254, 0, 25, - 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 0, 109, 254, 0, 113, - 254, 0, 115, - 254, 0, 117, 254, 40, 80, 252, 102, 253, 112, 253, 118, 254, 122, 249, - 211, 252, - 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 233, 253, 234, 253, 235, - 253, - 236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 250, - 254, - 251, 254, 252, 254, 253, 254, 254, 249, 0, 1, 249, 0, 21, 253, 0, 25, 253, - 0, 27, 253, - 0, 29, 253, 0, 78, 252, 0, 79, 253, 0, 82, 252, 0, 83, 253, 0, 109, 254, - 0, 113, 254, - 0, 115, 254, 0, 117, 254, 14, 85, 242, 87, 242, 88, 242, 90, 242, 122, - 248, 222, 242, - 254, 248, 0, 1, 248, 0, 100, 242, 0, 102, 242, 0, 122, 242, 1, 32, 25, - 239, 1, 32, 29, - 254, 11, 66, 254, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, - 254, 0, - 2, 254, 0, 4, 254, 0, 6, 254, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, - 250, 90, 249, - 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, - 2, 250, - 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 41, 45, 242, - 47, 239, 66, - 245, 98, 255, 102, 254, 112, 254, 193, 245, 194, 245, 195, 245, 196, 245, - 197, 245, - 198, 245, 225, 255, 226, 255, 227, 255, 228, 255, 229, 255, 230, 255, 233, - 254, - 234, 254, 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, - 254, - 249, 254, 0, 2, 245, 0, 3, 255, 0, 4, 245, 0, 5, 255, 0, 6, 245, 0, 7, - 255, 0, 21, 254, - 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, 11, 47, 254, - 86, 255, 218, - 255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, - 0, 116, - 255, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211, 252, - 212, 252, - 213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252, 221, - 252, - 222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108, 252, - 0, 112, 252, - 0, 114, 252, 0, 116, 252, 0, 122, 251, 73, 45, 245, 46, 242, 47, 242, 59, - 245, 60, - 245, 66, 242, 80, 254, 98, 242, 102, 242, 106, 254, 112, 242, 115, 245, - 118, 242, - 120, 245, 122, 251, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, - 242, - 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 248, 226, - 242, - 227, 248, 228, 248, 229, 248, 230, 242, 233, 248, 234, 242, 235, 242, 236, - 248, - 238, 254, 243, 242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, - 242, - 251, 242, 252, 242, 253, 242, 254, 251, 0, 1, 251, 0, 2, 242, 0, 3, 248, - 0, 4, 242, - 0, 5, 248, 0, 6, 242, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, - 29, 242, 0, 49, - 254, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, 83, 242, 0, 87, 245, 0, 89, - 245, 0, 91, 245, - 0, 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 13, 45, 249, 47, 249, - 66, 247, - 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2, 247, 0, - 4, 247, - 0, 6, 247, 72, 45, 235, 46, 245, 47, 233, 59, 242, 60, 242, 66, 234, 72, - 252, 80, 249, - 98, 242, 102, 240, 106, 251, 112, 240, 118, 242, 193, 234, 194, 234, 195, - 234, 196, - 234, 197, 234, 198, 234, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, - 217, - 249, 225, 242, 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 240, - 234, - 240, 235, 240, 236, 240, 237, 251, 238, 251, 239, 251, 240, 251, 243, 240, - 244, - 240, 245, 240, 246, 240, 247, 240, 249, 240, 250, 242, 251, 242, 252, 242, - 253, - 242, 0, 2, 234, 0, 3, 242, 0, 4, 234, 0, 5, 242, 0, 6, 234, 0, 7, 242, 0, - 21, 240, 0, 25, - 240, 0, 27, 240, 0, 29, 240, 0, 32, 252, 0, 36, 252, 0, 45, 251, 0, 49, - 251, 0, 78, 249, - 0, 79, 240, 0, 82, 249, 0, 83, 240, 0, 109, 242, 0, 113, 242, 0, 115, 242, - 0, 117, 242, - 68, 45, 242, 46, 251, 47, 242, 59, 248, 60, 248, 66, 237, 80, 255, 98, - 246, 102, 246, - 106, 254, 112, 244, 118, 249, 122, 247, 193, 237, 194, 237, 195, 237, 196, - 237, - 197, 237, 198, 237, 211, 255, 212, 255, 213, 255, 214, 255, 215, 255, 217, - 255, - 225, 246, 226, 246, 227, 246, 228, 246, 229, 246, 230, 246, 233, 246, 234, - 246, - 235, 246, 236, 246, 238, 254, 243, 244, 244, 244, 245, 244, 246, 244, 247, - 244, - 249, 244, 250, 249, 251, 249, 252, 249, 253, 249, 254, 247, 0, 1, 247, 0, - 2, 237, - 0, 3, 246, 0, 4, 237, 0, 5, 246, 0, 6, 237, 0, 7, 246, 0, 21, 246, 0, 25, - 246, 0, 27, 246, - 0, 29, 246, 0, 49, 254, 0, 78, 255, 0, 79, 244, 0, 82, 255, 0, 83, 244, 0, - 109, 249, - 0, 113, 249, 0, 115, 249, 0, 117, 249, 65, 45, 242, 46, 242, 47, 242, 59, - 242, 60, - 242, 66, 239, 80, 251, 98, 243, 102, 238, 106, 251, 112, 238, 118, 242, - 193, 239, - 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 251, 212, 251, 213, - 251, - 214, 251, 215, 251, 217, 251, 225, 243, 226, 243, 227, 243, 228, 243, 229, - 243, - 230, 243, 233, 245, 234, 238, 235, 238, 236, 245, 238, 251, 243, 238, 244, - 238, - 245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242, 252, 242, 253, - 242, - 0, 2, 239, 0, 3, 243, 0, 4, 239, 0, 5, 243, 0, 6, 239, 0, 7, 243, 0, 21, - 245, 0, 25, 238, - 0, 27, 238, 0, 29, 238, 0, 49, 251, 0, 78, 251, 0, 79, 238, 0, 82, 251, 0, - 83, 238, 0, - 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 119, 253, 13, 47, 250, - 99, 255, - 118, 254, 119, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 109, 254, - 0, 113, - 254, 0, 115, 254, 0, 117, 254, 2, 120, 254, 2, 119, 254, 16, 45, 254, 47, - 254, 106, - 253, 112, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, - 0, 51, - 251, 0, 79, 253, 0, 83, 253, 1, 32, 25, 9, 1, 32, 29, 8, 2, 47, 254, 4, - 122, 254, 254, - 254, 0, 1, 254, 2, 119, 255, 22, 102, 255, 112, 254, 122, 254, 233, 255, - 234, 255, - 235, 255, 236, 255, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, - 254, - 254, 254, 0, 1, 254, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, - 79, 254, 0, 83, - 254, 2, 119, 250, 3, 119, 255, 120, 255, 37, 45, 242, 46, 251, 47, 240, - 100, 254, - 102, 254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232, - 254, - 233, 254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245, - 254, - 246, 254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25, - 254, 0, 27, - 254, 0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74, - 254, 0, 79, 254, - 0, 83, 254, 31, 45, 248, 47, 245, 98, 255, 102, 255, 112, 255, 225, 255, - 226, 255, - 227, 255, 228, 255, 229, 255, 230, 255, 233, 255, 234, 255, 235, 255, 236, - 255, - 243, 255, 244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 0, 3, 255, 0, - 5, 255, - 0, 7, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0, - 83, 255, 12, - 45, 248, 47, 245, 112, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247, - 255, 249, - 255, 0, 79, 255, 0, 83, 255, 21, 45, 248, 47, 245, 102, 255, 112, 253, - 233, 255, 234, - 255, 235, 255, 236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, - 249, - 253, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83, - 253, 51, 68, - 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, - 240, 113, - 253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211, 249, 212, 249, - 213, - 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, - 248, 0, 14, - 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, - 241, 0, 108, - 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, - 116, 249, - 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 51, 68, 248, 72, 248, 80, 249, - 82, 249, 85, - 241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118, 249, 119, 240, - 120, 242, - 122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, - 249, - 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249, 251, 249, 252, - 249, - 253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0, 32, 248, 0, 36, - 248, 0, 78, - 249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109, 249, 0, - 112, 249, 0, - 113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0, 122, 240, - 1, 32, 25, - 245, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87, 233, - 88, 235, 90, - 240, 113, 253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211, 249, - 212, - 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, - 221, - 249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, - 245, 0, 8, - 248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100, - 241, 0, 102, - 241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0, - 115, 249, - 0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 51, 68, 248, 72, - 248, 80, 249, - 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118, 249, - 119, 240, - 120, 242, 122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249, 215, - 249, - 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249, 251, - 249, - 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0, 32, - 248, 0, 36, 248, - 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109, - 249, 0, 112, - 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0, - 122, 240, - 1, 32, 25, 245, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, - 87, 233, - 88, 235, 90, 240, 113, 253, 118, 249, 119, 240, 120, 242, 122, 245, 200, - 248, 211, - 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, - 220, - 249, 221, 249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, - 0, 1, - 245, 0, 8, 248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, - 249, 0, 100, 241, - 0, 102, 241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, - 249, 0, 115, - 249, 0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 51, 68, 248, - 72, 248, 80, - 249, 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118, - 249, 119, - 240, 120, 242, 122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249, - 215, - 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249, - 251, - 249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0, - 32, 248, 0, - 36, 248, 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, - 109, 249, - 0, 112, 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117, - 249, 0, 122, - 240, 1, 32, 25, 245, 11, 66, 254, 193, 254, 194, 254, 195, 254, 196, 254, - 197, 254, - 198, 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 20, 66, 250, 85, 250, 87, 249, - 88, 249, 89, - 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, - 222, 249, - 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, - 20, 66, 250, - 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, - 196, 250, - 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, - 250, 0, 102, - 250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, - 249, 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, - 4, 250, - 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 250, 85, 250, - 87, 249, 88, - 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, - 198, 250, - 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, - 122, 249, 20, - 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, - 195, 250, - 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, - 0, 100, 250, - 0, 102, 250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, - 90, 249, - 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, - 2, 250, - 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 13, 45, 249, - 47, 249, 66, - 247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2, - 247, 0, 4, - 247, 0, 6, 247, 13, 45, 249, 47, 249, 66, 247, 193, 247, 194, 247, 195, - 247, 196, - 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247, 13, 45, 249, 47, - 249, 66, - 247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2, - 247, 0, 4, - 247, 0, 6, 247, 13, 45, 249, 47, 249, 66, 247, 193, 247, 194, 247, 195, - 247, 196, - 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247, 65, 45, 242, 46, - 242, 47, - 242, 59, 242, 60, 242, 66, 239, 80, 251, 98, 243, 102, 238, 106, 251, 112, - 238, 118, - 242, 193, 239, 194, 239, 195, 239, 196, 239, 197, 239, 198, 239, 211, 251, - 212, - 251, 213, 251, 214, 251, 215, 251, 217, 251, 225, 243, 226, 243, 227, 243, - 228, - 243, 229, 243, 230, 243, 233, 245, 234, 238, 235, 238, 236, 245, 238, 251, - 243, - 238, 244, 238, 245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242, - 252, - 242, 253, 242, 0, 2, 239, 0, 3, 243, 0, 4, 239, 0, 5, 243, 0, 6, 239, 0, - 7, 243, 0, 21, - 245, 0, 25, 238, 0, 27, 238, 0, 29, 238, 0, 49, 251, 0, 78, 251, 0, 79, - 238, 0, 82, 251, - 0, 83, 238, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 119, - 253, 2, 119, - 253, 2, 119, 253, 2, 119, 253, 2, 119, 253, 2, 119, 253, 2, 119, 254, 2, - 119, 254, - 2, 119, 254, 2, 119, 254, 2, 119, 255, 2, 119, 255, 2, 119, 255, 2, 119, - 255, 2, 119, - 250, 3, 119, 255, 120, 255, 3, 119, 255, 120, 255, 3, 119, 255, 120, 255, - 3, 119, - 255, 120, 255, 3, 119, 255, 120, 255, 3, 119, 255, 120, 255, 21, 45, 248, - 47, 245, - 102, 255, 112, 253, 233, 255, 234, 255, 235, 255, 236, 255, 243, 253, 244, - 253, - 245, 253, 246, 253, 247, 253, 249, 253, 0, 21, 255, 0, 25, 255, 0, 27, - 255, 0, 29, - 255, 0, 79, 253, 0, 83, 253, 21, 45, 248, 47, 245, 102, 255, 112, 253, - 233, 255, 234, - 255, 235, 255, 236, 255, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, - 249, - 253, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 253, 0, 83, - 253, 51, 68, - 248, 72, 248, 80, 249, 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, - 240, 113, - 253, 118, 249, 119, 240, 120, 242, 122, 245, 200, 248, 211, 249, 212, 249, - 213, - 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 240, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, - 248, 0, 14, - 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, - 241, 0, 108, - 249, 0, 109, 249, 0, 112, 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, - 116, 249, - 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, 2, 119, 253, 51, 68, 248, 72, - 248, 80, 249, - 82, 249, 85, 241, 86, 249, 87, 233, 88, 235, 90, 240, 113, 253, 118, 249, - 119, 240, - 120, 242, 122, 245, 200, 248, 211, 249, 212, 249, 213, 249, 214, 249, 215, - 249, - 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 240, 250, 249, 251, - 249, - 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, 8, 248, 0, 14, 248, 0, 32, - 248, 0, 36, 248, - 0, 78, 249, 0, 82, 249, 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109, - 249, 0, 112, - 249, 0, 113, 249, 0, 114, 249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0, - 122, 240, - 1, 32, 25, 245, 2, 119, 253, 51, 68, 248, 72, 248, 80, 249, 82, 249, 85, - 241, 86, 249, - 87, 233, 88, 235, 90, 240, 113, 253, 118, 249, 119, 240, 120, 242, 122, - 251, 200, - 248, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, - 219, - 249, 220, 249, 221, 249, 222, 240, 250, 249, 251, 249, 252, 249, 253, 249, - 254, - 251, 0, 1, 251, 0, 8, 248, 0, 14, 248, 0, 32, 248, 0, 36, 248, 0, 78, 249, - 0, 82, 249, - 0, 100, 241, 0, 102, 241, 0, 108, 249, 0, 109, 249, 0, 112, 249, 0, 113, - 249, 0, 114, - 249, 0, 115, 249, 0, 116, 249, 0, 117, 249, 0, 122, 240, 1, 32, 25, 245, - 2, 119, 253, - 17, 47, 254, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194, 251, 195, - 251, 196, - 251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, - 122, 250, 17, - 47, 254, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194, 251, 195, 251, - 196, 251, - 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 122, - 250, 2, 120, - 254, 2, 119, 254, 2, 119, 254, 2, 119, 254, 2, 119, 254, 2, 47, 254, 2, - 47, 254, 2, - 119, 255, 2, 119, 255, 40, 80, 252, 102, 253, 112, 253, 118, 254, 122, - 249, 211, - 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 233, 253, 234, 253, - 235, - 253, 236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, - 250, - 254, 251, 254, 252, 254, 253, 254, 254, 249, 0, 1, 249, 0, 21, 253, 0, 25, - 253, 0, - 27, 253, 0, 29, 253, 0, 78, 252, 0, 79, 253, 0, 82, 252, 0, 83, 253, 0, - 109, 254, 0, - 113, 254, 0, 115, 254, 0, 117, 254, 22, 102, 255, 112, 254, 122, 254, 233, - 255, 234, - 255, 235, 255, 236, 255, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, - 249, - 254, 254, 254, 0, 1, 254, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, - 0, 79, 254, - 0, 83, 254, 14, 85, 242, 87, 242, 88, 242, 90, 242, 122, 248, 222, 242, - 254, 248, - 0, 1, 248, 0, 100, 242, 0, 102, 242, 0, 122, 242, 1, 32, 25, 239, 1, 32, - 29, 254, 14, - 85, 242, 87, 242, 88, 242, 90, 242, 122, 248, 222, 242, 254, 248, 0, 1, - 248, 0, 100, - 242, 0, 102, 242, 0, 122, 242, 1, 32, 25, 239, 1, 32, 29, 254, 14, 85, - 242, 87, 242, - 88, 242, 90, 242, 122, 248, 222, 242, 254, 248, 0, 1, 248, 0, 100, 242, 0, - 102, 242, - 0, 122, 242, 1, 32, 25, 239, 1, 32, 29, 254, 11, 66, 254, 193, 254, 194, - 254, 195, - 254, 196, 254, 197, 254, 198, 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 2, - 119, 250, 11, - 66, 254, 193, 254, 194, 254, 195, 254, 196, 254, 197, 254, 198, 254, 0, 2, - 254, 0, - 4, 254, 0, 6, 254, 2, 119, 250, 11, 66, 254, 193, 254, 194, 254, 195, 254, - 196, 254, - 197, 254, 198, 254, 0, 2, 254, 0, 4, 254, 0, 6, 254, 2, 119, 250, 20, 66, - 250, 85, 250, - 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, - 250, 197, - 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, - 102, 250, - 0, 122, 249, 3, 119, 255, 120, 255, 20, 66, 250, 85, 250, 87, 249, 88, - 249, 89, 250, - 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, - 249, 0, - 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 3, - 119, 255, 120, - 255, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211, 252, - 212, 252, - 213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252, 221, - 252, - 222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108, 252, - 0, 112, 252, - 0, 114, 252, 0, 116, 252, 0, 122, 251, 37, 45, 242, 46, 251, 47, 240, 100, - 254, 102, - 254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232, 254, - 233, - 254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245, 254, - 246, - 254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25, 254, 0, - 27, 254, - 0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74, 254, 0, - 79, 254, 0, - 83, 254, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211, - 252, 212, - 252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252, - 221, - 252, 222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108, - 252, 0, 112, - 252, 0, 114, 252, 0, 116, 252, 0, 122, 251, 37, 45, 242, 46, 251, 47, 240, - 100, 254, - 102, 254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232, - 254, - 233, 254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245, - 254, - 246, 254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25, - 254, 0, 27, - 254, 0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74, - 254, 0, 79, 254, - 0, 83, 254, 27, 80, 252, 85, 250, 86, 252, 87, 248, 88, 251, 90, 251, 211, - 252, 212, - 252, 213, 252, 214, 252, 215, 252, 217, 252, 218, 252, 219, 252, 220, 252, - 221, - 252, 222, 251, 0, 78, 252, 0, 82, 252, 0, 100, 250, 0, 102, 250, 0, 108, - 252, 0, 112, - 252, 0, 114, 252, 0, 116, 252, 0, 122, 251, 37, 45, 242, 46, 251, 47, 240, - 100, 254, - 102, 254, 104, 255, 111, 254, 112, 254, 113, 255, 114, 254, 119, 255, 232, - 254, - 233, 254, 234, 254, 235, 254, 236, 254, 242, 254, 243, 254, 244, 254, 245, - 254, - 246, 254, 247, 254, 249, 254, 0, 9, 254, 0, 15, 254, 0, 21, 254, 0, 25, - 254, 0, 27, - 254, 0, 29, 254, 0, 33, 255, 0, 37, 255, 0, 70, 254, 0, 72, 254, 0, 74, - 254, 0, 79, 254, - 0, 83, 254, 73, 45, 245, 46, 242, 47, 242, 59, 245, 60, 245, 66, 242, 80, - 254, 98, - 242, 102, 242, 106, 254, 112, 242, 115, 245, 118, 242, 120, 245, 122, 251, - 193, - 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 254, 212, 254, - 213, - 254, 214, 254, 215, 254, 217, 254, 225, 248, 226, 242, 227, 248, 228, 248, - 229, - 248, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 254, 243, 242, - 244, - 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242, - 253, - 242, 254, 251, 0, 1, 251, 0, 2, 242, 0, 3, 248, 0, 4, 242, 0, 5, 248, 0, - 6, 242, 0, 7, - 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, 254, 0, 78, - 254, 0, 79, 242, - 0, 82, 254, 0, 83, 242, 0, 87, 245, 0, 89, 245, 0, 91, 245, 0, 109, 242, - 0, 113, 242, - 0, 115, 242, 0, 117, 242, 73, 45, 245, 46, 242, 47, 242, 59, 245, 60, 245, - 66, 242, - 80, 254, 98, 242, 102, 242, 106, 254, 112, 242, 115, 245, 118, 242, 120, - 245, 122, - 251, 193, 242, 194, 242, 195, 242, 196, 242, 197, 242, 198, 242, 211, 254, - 212, - 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 248, 226, 242, 227, 248, - 228, - 248, 229, 248, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 254, - 243, - 242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 242, 251, 242, - 252, - 242, 253, 242, 254, 251, 0, 1, 251, 0, 2, 242, 0, 3, 248, 0, 4, 242, 0, 5, - 248, 0, 6, - 242, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, - 254, 0, 78, 254, - 0, 79, 242, 0, 82, 254, 0, 83, 242, 0, 87, 245, 0, 89, 245, 0, 91, 245, 0, - 109, 242, - 0, 113, 242, 0, 115, 242, 0, 117, 242, 13, 45, 249, 47, 249, 66, 247, 193, - 247, 194, - 247, 195, 247, 196, 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, - 247, 13, 45, - 249, 47, 249, 66, 247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, - 198, 247, - 0, 2, 247, 0, 4, 247, 0, 6, 247, 13, 45, 249, 47, 249, 66, 247, 193, 247, - 194, 247, - 195, 247, 196, 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247, - 13, 45, 249, - 47, 249, 66, 247, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, - 247, 0, - 2, 247, 0, 4, 247, 0, 6, 247, 65, 45, 242, 46, 242, 47, 242, 59, 242, 60, - 242, 66, 239, - 80, 251, 98, 243, 102, 238, 106, 251, 112, 238, 118, 242, 193, 239, 194, - 239, 195, - 239, 196, 239, 197, 239, 198, 239, 211, 251, 212, 251, 213, 251, 214, 251, - 215, - 251, 217, 251, 225, 243, 226, 243, 227, 243, 228, 243, 229, 243, 230, 243, - 233, - 245, 234, 238, 235, 238, 236, 245, 238, 251, 243, 238, 244, 238, 245, 238, - 246, - 238, 247, 238, 249, 238, 250, 242, 251, 242, 252, 242, 253, 242, 0, 2, - 239, 0, 3, - 243, 0, 4, 239, 0, 5, 243, 0, 6, 239, 0, 7, 243, 0, 21, 245, 0, 25, 238, - 0, 27, 238, 0, - 29, 238, 0, 49, 251, 0, 78, 251, 0, 79, 238, 0, 82, 251, 0, 83, 238, 0, - 109, 242, 0, - 113, 242, 0, 115, 242, 0, 117, 242, 12, 66, 255, 193, 255, 194, 255, 195, - 255, 196, - 255, 197, 255, 198, 255, 0, 2, 255, 0, 4, 255, 0, 6, 255, 1, 32, 24, 246, - 15, 33, 245, - 101, 254, 115, 254, 116, 251, 119, 254, 0, 19, 254, 0, 87, 254, 0, 89, - 254, 0, 91, - 254, 0, 93, 251, 0, 97, 251, 0, 99, 251, 1, 2, 25, 251, 1, 32, 25, 246, - 11, 66, 255, - 193, 255, 194, 255, 195, 255, 196, 255, 197, 255, 198, 255, 0, 2, 255, 0, - 4, 255, - 0, 6, 255 -}; -static afm_cuint16 afm_Times_Bold_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Times_Bold_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Times-BoldItalic */ -/* FullName: Times Bold Italic */ -/* FamilyName: Times */ -static afm_cuint8 afm_Times_BoldItalic_widths[] = { /* 315 */ - 42, 65, 93, 83, 83, 139, 130, 46, 56, 56, 83, 95, 42, 56, 42, 46, 83, 83, - 83, 83, 83, - 83, 83, 83, 83, 83, 56, 56, 95, 95, 95, 83, 139, 111, 111, 111, 120, 111, - 111, 120, - 130, 65, 83, 111, 102, 148, 120, 120, 102, 120, 111, 93, 102, 120, 111, - 148, 111, - 102, 102, 56, 46, 56, 95, 83, 56, 83, 83, 74, 83, 74, 56, 83, 93, 46, 46, - 83, 46, 130, - 93, 83, 83, 83, 65, 65, 46, 93, 74, 111, 83, 74, 65, 58, 37, 58, 95, 65, - 83, 83, 83, - 83, 37, 83, 56, 125, 44, 83, 101, 125, 56, 67, 95, 50, 50, 56, 96, 83, 42, - 56, 50, 50, - 83, 125, 125, 125, 83, 111, 111, 111, 111, 111, 111, 157, 111, 111, 111, - 111, 111, - 65, 65, 65, 65, 120, 120, 120, 120, 120, 120, 120, 95, 120, 120, 120, 120, - 120, 102, - 102, 83, 83, 83, 83, 83, 83, 83, 120, 74, 74, 74, 74, 74, 46, 46, 46, 46, - 83, 93, 83, - 83, 83, 83, 83, 95, 83, 93, 93, 93, 93, 74, 83, 74, 111, 83, 111, 83, 111, - 83, 111, - 74, 111, 74, 120, 101, 120, 83, 111, 74, 111, 74, 111, 74, 111, 74, 120, - 83, 120, - 83, 65, 46, 65, 46, 65, 46, 111, 83, 102, 46, 102, 46, 102, 64, 102, 46, - 120, 93, 120, - 93, 120, 93, 120, 83, 120, 83, 157, 120, 111, 65, 111, 65, 111, 65, 93, - 65, 93, 65, - 93, 65, 102, 46, 102, 61, 120, 93, 120, 93, 120, 93, 120, 93, 102, 102, - 65, 102, 65, - 102, 65, 83, 93, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 167, 56, 56, 56, - 83, 83, 83, - 83, 83, 58, 167, 167, 56, 56, 28, 83, 167, 82, 102, 100, 101, 92, 92, 92, - 92, 82, 42, - 93, 93 -}; -static afm_sint16 afm_Times_BoldItalic_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 173, 0, 219, 0, 254, 0, 0, 0, 374, 489, 581, 0, 612, 636, 681, - 774, 797, 0, - 859, 1027, 1051, 1207, 0, 1362, 0, 0, 0, 0, 0, 0, 0, 0, 1510, 1537, 0, - 1545, 1548, - 0, 0, 0, 0, 1587, 0, 0, 1630, 1633, 0, 0, 1647, 0, 0, 0, 1652, 1699, 1769, - 1792, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1797, 1916, 2035, 2154, 2273, 2392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2511, 2535, - 2580, 2625, 2670, 2715, 0, 2760, 2805, 2829, 2853, 2877, 2901, 0, 0, 0, 0, - 0, 0, - 0, 0, 0, 3049, 3057, 3060, 3063, 3066, 0, 0, 0, 0, 0, 3069, 3072, 3086, - 3100, 3114, - 3128, 0, 3142, 0, 0, 0, 0, 3156, 0, 3161, 3166, 0, 3285, 0, 3404, 0, 0, - 3523, 0, 3531, - 3539, 0, 3574, 0, 0, 3609, 0, 3612, 0, 3615, 0, 3618, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3621, - 3713, 3756, 0, 3787, 0, 0, 0, 3818, 0, 3849, 3873, 3876, 3900, 3903, 3927, - 3930, - 3975, 3989, 4034, 0, 0, 4048, 4110, 4115, 4177, 4182, 4244, 0, 0, 0, 0, 0, - 0, 4249, - 0, 4417, 0, 4585, 0, 4609, 0, 4633, 0, 4657, 0, 4681, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4829, 4834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 -}; -static afm_cuint8 afm_Times_BoldItalic_kerning_data[] = { /* 4879 */ - 42, 16, 66, 251, 87, 245, 88, 245, 90, 245, 193, 251, 194, 251, 195, 251, - 196, 251, - 197, 251, 198, 251, 222, 245, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 122, - 245, 3, 1, 32, - 25, 241, 1, 32, 29, 241, 3, 1, 32, 25, 241, 1, 32, 29, 241, 50, 68, 246, - 72, 247, 80, - 249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119, - 245, 120, - 245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, - 217, - 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252, - 252, - 252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, - 36, 247, 0, - 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252, - 0, 112, 249, - 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, - 245, 1, 32, - 25, 245, 20, 66, 253, 86, 255, 193, 253, 194, 253, 195, 253, 196, 253, - 197, 253, - 198, 253, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 253, 0, 4, 253, 0, - 6, 253, - 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 16, 66, 253, 87, 249, - 88, 250, - 90, 249, 193, 253, 194, 253, 195, 253, 196, 253, 197, 253, 198, 253, 222, - 249, 0, - 2, 253, 0, 4, 253, 0, 6, 253, 0, 122, 249, 52, 45, 235, 47, 235, 66, 240, - 98, 241, 102, - 240, 106, 250, 112, 245, 115, 249, 193, 240, 194, 240, 195, 240, 196, 240, - 197, - 240, 198, 240, 225, 241, 226, 241, 227, 241, 228, 241, 229, 241, 230, 241, - 233, - 240, 234, 240, 235, 240, 236, 240, 237, 250, 238, 250, 239, 250, 240, 250, - 243, - 245, 244, 245, 245, 245, 246, 245, 247, 245, 249, 245, 0, 2, 240, 0, 3, - 241, 0, 4, - 240, 0, 5, 241, 0, 6, 240, 0, 7, 241, 0, 21, 240, 0, 25, 240, 0, 27, 240, - 0, 29, 240, - 0, 45, 250, 0, 49, 250, 0, 79, 245, 0, 83, 245, 0, 87, 249, 0, 89, 249, 0, - 91, 249, 50, - 45, 255, 47, 255, 66, 253, 98, 250, 102, 250, 112, 250, 118, 250, 193, - 253, 194, - 253, 195, 253, 196, 253, 197, 253, 198, 253, 225, 250, 226, 250, 227, 250, - 228, - 250, 229, 250, 230, 250, 233, 250, 234, 250, 235, 250, 236, 250, 243, 250, - 244, - 250, 245, 250, 246, 250, 247, 250, 249, 250, 250, 250, 251, 250, 252, 250, - 253, - 250, 0, 2, 253, 0, 3, 250, 0, 4, 253, 0, 5, 250, 0, 6, 253, 0, 7, 250, 0, - 21, 250, 0, 25, - 250, 0, 27, 250, 0, 29, 250, 0, 79, 250, 0, 83, 250, 0, 109, 250, 0, 113, - 250, 0, 115, - 250, 0, 117, 250, 40, 80, 252, 102, 253, 112, 253, 118, 254, 122, 254, - 211, 252, - 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 233, 253, 234, 253, 235, - 253, - 236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 250, - 254, - 251, 254, 252, 254, 253, 254, 254, 254, 0, 1, 254, 0, 21, 253, 0, 25, 253, - 0, 27, 253, - 0, 29, 253, 0, 78, 252, 0, 79, 253, 0, 82, 252, 0, 83, 253, 0, 109, 254, - 0, 113, 254, - 0, 115, 254, 0, 117, 254, 13, 85, 254, 87, 251, 88, 251, 90, 251, 122, - 251, 222, 251, - 254, 251, 0, 1, 251, 0, 100, 254, 0, 102, 254, 0, 122, 251, 1, 32, 25, - 248, 11, 66, - 252, 193, 252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, - 252, 0, 4, - 252, 0, 6, 252, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, - 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, - 4, 250, - 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 41, 45, 235, 47, 235, - 66, 243, 98, - 250, 102, 249, 112, 248, 193, 243, 194, 243, 195, 243, 196, 243, 197, 243, - 198, - 243, 225, 250, 226, 250, 227, 250, 228, 250, 229, 250, 230, 250, 233, 249, - 234, - 249, 235, 249, 236, 249, 243, 248, 244, 248, 245, 248, 246, 248, 247, 248, - 249, - 248, 0, 2, 243, 0, 3, 250, 0, 4, 243, 0, 5, 250, 0, 6, 243, 0, 7, 250, 0, - 21, 249, 0, 25, - 249, 0, 27, 249, 0, 29, 249, 0, 79, 248, 0, 83, 248, 10, 86, 255, 218, - 255, 219, 255, - 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, - 27, 80, 250, - 85, 252, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250, - 214, 250, - 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0, - 78, 250, - 0, 82, 250, 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, - 250, 0, 116, - 250, 0, 122, 254, 73, 45, 242, 46, 242, 47, 242, 59, 245, 60, 245, 66, - 248, 80, 254, - 98, 242, 102, 242, 106, 251, 112, 241, 115, 251, 118, 251, 120, 251, 122, - 251, 193, - 248, 194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 211, 254, 212, 254, - 213, - 254, 214, 254, 215, 254, 217, 254, 225, 242, 226, 242, 227, 242, 228, 242, - 229, - 242, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 251, 243, 241, - 244, - 241, 245, 241, 246, 241, 247, 241, 249, 241, 250, 251, 251, 251, 252, 251, - 253, - 251, 254, 251, 0, 1, 251, 0, 2, 248, 0, 3, 242, 0, 4, 248, 0, 5, 242, 0, - 6, 248, 0, 7, - 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, 251, 0, 78, - 254, 0, 79, 241, - 0, 82, 254, 0, 83, 241, 0, 87, 251, 0, 89, 251, 0, 91, 251, 0, 109, 251, - 0, 113, 251, - 0, 115, 251, 0, 117, 251, 11, 66, 249, 193, 249, 194, 249, 195, 249, 196, - 249, 197, - 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 68, 45, 235, 46, 245, 47, - 235, 59, 245, - 60, 245, 66, 243, 72, 255, 80, 252, 98, 238, 102, 238, 106, 248, 112, 238, - 118, 248, - 193, 243, 194, 243, 195, 243, 196, 243, 197, 243, 198, 243, 211, 252, 212, - 252, - 213, 252, 214, 252, 215, 252, 217, 252, 225, 238, 226, 238, 227, 238, 228, - 238, - 229, 238, 230, 238, 233, 245, 234, 238, 235, 238, 236, 245, 238, 248, 243, - 238, - 244, 238, 245, 238, 246, 238, 247, 238, 249, 238, 250, 248, 251, 248, 252, - 248, - 253, 248, 0, 2, 243, 0, 3, 238, 0, 4, 243, 0, 5, 238, 0, 6, 243, 0, 7, - 238, 0, 21, 245, - 0, 25, 238, 0, 27, 238, 0, 29, 238, 0, 32, 255, 0, 36, 255, 0, 49, 248, 0, - 78, 252, 0, - 79, 238, 0, 82, 252, 0, 83, 238, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, - 117, 248, - 68, 45, 245, 46, 249, 47, 245, 59, 248, 60, 248, 66, 245, 80, 254, 98, - 243, 102, 242, - 106, 251, 112, 244, 118, 248, 122, 248, 193, 245, 194, 245, 195, 245, 196, - 245, - 197, 245, 198, 245, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, - 254, - 225, 243, 226, 243, 227, 243, 228, 243, 229, 243, 230, 243, 233, 249, 234, - 242, - 235, 242, 236, 249, 238, 251, 243, 244, 244, 244, 245, 244, 246, 244, 247, - 244, - 249, 244, 250, 248, 251, 248, 252, 248, 253, 248, 254, 248, 0, 1, 248, 0, - 2, 245, - 0, 3, 243, 0, 4, 245, 0, 5, 243, 0, 6, 245, 0, 7, 243, 0, 21, 249, 0, 25, - 242, 0, 27, 242, - 0, 29, 242, 0, 49, 251, 0, 78, 254, 0, 79, 244, 0, 82, 254, 0, 83, 244, 0, - 109, 248, - 0, 113, 248, 0, 115, 248, 0, 117, 248, 65, 45, 242, 46, 242, 47, 245, 59, - 242, 60, - 242, 66, 245, 80, 253, 98, 242, 102, 238, 106, 248, 112, 238, 118, 242, - 193, 245, - 194, 245, 195, 245, 196, 245, 197, 245, 198, 245, 211, 253, 212, 253, 213, - 253, - 214, 253, 215, 253, 217, 253, 225, 242, 226, 242, 227, 242, 228, 242, 229, - 242, - 230, 242, 233, 245, 234, 238, 235, 245, 236, 245, 238, 248, 243, 238, 244, - 238, - 245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242, 252, 242, 253, - 242, - 0, 2, 245, 0, 3, 242, 0, 4, 245, 0, 5, 242, 0, 6, 245, 0, 7, 242, 0, 21, - 245, 0, 25, 238, - 0, 27, 238, 0, 29, 238, 0, 49, 248, 0, 78, 253, 0, 79, 238, 0, 82, 253, 0, - 83, 238, 0, - 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 12, 47, 250, 99, 255, - 118, 254, 250, - 254, 251, 254, 252, 254, 253, 254, 0, 109, 254, 0, 113, 254, 0, 115, 254, - 0, 117, - 254, 4, 105, 255, 108, 255, 0, 57, 255, 2, 99, 255, 17, 45, 255, 47, 255, - 102, 255, - 103, 254, 112, 255, 234, 255, 243, 255, 244, 255, 245, 255, 246, 255, 249, - 255, - 0, 25, 255, 0, 27, 255, 0, 51, 252, 0, 83, 255, 1, 32, 25, 9, 19, 102, - 252, 112, 255, - 233, 252, 234, 252, 235, 252, 236, 252, 243, 255, 244, 255, 245, 255, 246, - 255, - 247, 255, 249, 255, 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79, - 255, 0, 83, - 255, 2, 119, 250, 7, 119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, - 1, 255, - 3, 45, 246, 47, 246, 21, 45, 251, 47, 251, 102, 254, 112, 254, 233, 254, - 234, 254, - 235, 254, 236, 254, 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, - 254, - 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, 83, 254, - 31, 45, 251, - 47, 251, 98, 255, 102, 255, 112, 254, 225, 255, 226, 255, 227, 255, 228, - 255, 229, - 255, 230, 255, 233, 255, 234, 255, 235, 255, 236, 255, 243, 254, 244, 254, - 245, - 254, 246, 254, 247, 254, 249, 254, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 21, - 255, 0, 25, - 255, 0, 27, 255, 0, 29, 255, 0, 79, 254, 0, 83, 254, 10, 102, 255, 233, - 255, 234, 255, - 235, 255, 236, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 3, 45, - 251, 47, - 251, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87, 241, - 88, 240, 90, - 245, 118, 252, 119, 245, 120, 245, 122, 245, 200, 246, 211, 249, 212, 249, - 213, - 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245, 0, 1, 245, 0, 8, - 246, 0, 14, - 246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, - 248, 0, 108, - 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, - 116, 249, - 0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 50, 68, 246, 72, 247, 80, 249, - 82, 248, 85, - 248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119, 245, 120, 245, - 122, 245, - 200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, - 249, - 219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252, 252, 252, 253, - 252, - 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, 36, 247, 0, 78, - 249, 0, 82, - 249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, - 113, 252, - 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, 245, 1, 32, - 25, 245, 50, - 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240, - 90, 245, 118, - 252, 119, 245, 120, 245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249, - 214, - 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245, - 250, - 252, 251, 252, 252, 252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, - 246, 0, 32, - 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108, - 249, 0, 109, - 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, - 117, 252, - 0, 122, 245, 1, 32, 25, 245, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, - 248, 86, 249, - 87, 241, 88, 240, 90, 245, 118, 252, 119, 245, 120, 245, 122, 245, 200, - 246, 211, - 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, - 220, - 249, 221, 249, 222, 245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245, - 0, 1, - 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, - 249, 0, 100, 248, - 0, 102, 248, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, - 249, 0, 115, - 252, 0, 116, 249, 0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 50, 68, 246, - 72, 247, 80, - 249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119, - 245, 120, - 245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, - 217, - 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252, - 252, - 252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, - 36, 247, 0, - 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252, - 0, 112, 249, - 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, - 245, 1, 32, - 25, 245, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87, - 241, 88, 240, - 90, 245, 118, 252, 119, 245, 120, 245, 122, 245, 200, 246, 211, 249, 212, - 249, 213, - 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245, 0, 1, 245, 0, 8, - 246, 0, 14, - 246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, - 248, 0, 108, - 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, - 116, 249, - 0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 11, 66, 252, 193, 252, 194, 252, - 195, 252, - 196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 20, 66, - 250, 85, 250, - 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, - 250, 197, - 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, - 102, 250, - 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, - 193, 250, 194, - 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, - 250, 0, 6, - 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, - 88, 249, - 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, - 250, 222, - 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, - 249, 20, 66, - 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, - 250, 196, - 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, - 100, 250, 0, - 102, 250, 0, 122, 249, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, - 90, 249, 193, - 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, - 250, 0, 4, - 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 250, 85, - 250, 87, 249, - 88, 249, 89, 250, 90, 249, 193, 250, 194, 250, 195, 250, 196, 250, 197, - 250, 198, - 250, 222, 249, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, - 0, 122, 249, - 11, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, - 0, 2, 249, - 0, 4, 249, 0, 6, 249, 11, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, - 197, 249, - 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 11, 66, 249, 193, 249, 194, - 249, 195, 249, - 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 11, 66, - 249, 193, 249, - 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, - 6, 249, - 65, 45, 242, 46, 242, 47, 245, 59, 242, 60, 242, 66, 245, 80, 253, 98, - 242, 102, 238, - 106, 248, 112, 238, 118, 242, 193, 245, 194, 245, 195, 245, 196, 245, 197, - 245, - 198, 245, 211, 253, 212, 253, 213, 253, 214, 253, 215, 253, 217, 253, 225, - 242, - 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 245, 234, 238, 235, - 245, - 236, 245, 238, 248, 243, 238, 244, 238, 245, 238, 246, 238, 247, 238, 249, - 238, - 250, 242, 251, 242, 252, 242, 253, 242, 0, 2, 245, 0, 3, 242, 0, 4, 245, - 0, 5, 242, - 0, 6, 245, 0, 7, 242, 0, 21, 245, 0, 25, 238, 0, 27, 238, 0, 29, 238, 0, - 49, 248, 0, 78, - 253, 0, 79, 238, 0, 82, 253, 0, 83, 238, 0, 109, 242, 0, 113, 242, 0, 115, - 242, 0, 117, - 242, 4, 105, 255, 108, 255, 0, 57, 255, 2, 99, 255, 2, 99, 255, 2, 99, - 255, 2, 99, 255, - 2, 119, 250, 7, 119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1, - 255, 7, 119, - 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1, 255, 7, 119, 254, 120, - 253, 121, - 255, 122, 255, 254, 255, 0, 1, 255, 7, 119, 254, 120, 253, 121, 255, 122, - 255, 254, - 255, 0, 1, 255, 7, 119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1, - 255, 7, - 119, 254, 120, 253, 121, 255, 122, 255, 254, 255, 0, 1, 255, 3, 45, 251, - 47, 251, - 3, 45, 251, 47, 251, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, - 249, 87, - 241, 88, 240, 90, 245, 118, 252, 119, 245, 120, 245, 122, 245, 200, 246, - 211, 249, - 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, - 249, - 221, 249, 222, 245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 245, 0, - 1, 245, - 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, - 100, 248, 0, - 102, 248, 0, 108, 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, - 0, 115, - 252, 0, 116, 249, 0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 50, 68, 246, - 72, 247, 80, - 249, 82, 248, 85, 248, 86, 249, 87, 241, 88, 240, 90, 245, 118, 252, 119, - 245, 120, - 245, 122, 245, 200, 246, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, - 217, - 249, 218, 249, 219, 249, 220, 249, 221, 249, 222, 245, 250, 252, 251, 252, - 252, - 252, 253, 252, 254, 245, 0, 1, 245, 0, 8, 246, 0, 14, 246, 0, 32, 247, 0, - 36, 247, 0, - 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, 248, 0, 108, 249, 0, 109, 252, - 0, 112, 249, - 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, 116, 249, 0, 117, 252, 0, 122, - 245, 1, 32, - 25, 245, 50, 68, 246, 72, 247, 80, 249, 82, 248, 85, 248, 86, 249, 87, - 241, 88, 240, - 90, 245, 118, 252, 119, 245, 120, 245, 122, 251, 200, 246, 211, 249, 212, - 249, 213, - 249, 214, 249, 215, 249, 217, 249, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 245, 250, 252, 251, 252, 252, 252, 253, 252, 254, 251, 0, 1, 251, 0, 8, - 246, 0, 14, - 246, 0, 32, 247, 0, 36, 247, 0, 78, 249, 0, 82, 249, 0, 100, 248, 0, 102, - 248, 0, 108, - 249, 0, 109, 252, 0, 112, 249, 0, 113, 252, 0, 114, 249, 0, 115, 252, 0, - 116, 249, - 0, 117, 252, 0, 122, 245, 1, 32, 25, 245, 4, 105, 255, 108, 255, 0, 57, - 255, 4, 105, - 255, 108, 255, 0, 57, 255, 16, 66, 253, 87, 249, 88, 250, 90, 249, 193, - 253, 194, - 253, 195, 253, 196, 253, 197, 253, 198, 253, 222, 249, 0, 2, 253, 0, 4, - 253, 0, 6, - 253, 0, 122, 249, 16, 66, 253, 87, 249, 88, 250, 90, 249, 193, 253, 194, - 253, 195, - 253, 196, 253, 197, 253, 198, 253, 222, 249, 0, 2, 253, 0, 4, 253, 0, 6, - 253, 0, 122, - 249, 2, 99, 255, 2, 99, 255, 2, 99, 255, 2, 99, 255, 40, 80, 252, 102, - 253, 112, 253, - 118, 254, 122, 254, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, - 252, - 233, 253, 234, 253, 235, 253, 236, 253, 243, 253, 244, 253, 245, 253, 246, - 253, - 247, 253, 249, 253, 250, 254, 251, 254, 252, 254, 253, 254, 254, 254, 0, - 1, 254, - 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0, 78, 252, 0, 79, 253, 0, - 82, 252, 0, - 83, 253, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254, 19, 102, 252, - 112, 255, - 233, 252, 234, 252, 235, 252, 236, 252, 243, 255, 244, 255, 245, 255, 246, - 255, - 247, 255, 249, 255, 0, 21, 252, 0, 25, 252, 0, 27, 252, 0, 29, 252, 0, 79, - 255, 0, 83, - 255, 13, 85, 254, 87, 251, 88, 251, 90, 251, 122, 251, 222, 251, 254, 251, - 0, 1, 251, - 0, 100, 254, 0, 102, 254, 0, 122, 251, 1, 32, 25, 248, 13, 85, 254, 87, - 251, 88, 251, - 90, 251, 122, 251, 222, 251, 254, 251, 0, 1, 251, 0, 100, 254, 0, 102, - 254, 0, 122, - 251, 1, 32, 25, 248, 13, 85, 254, 87, 251, 88, 251, 90, 251, 122, 251, - 222, 251, 254, - 251, 0, 1, 251, 0, 100, 254, 0, 102, 254, 0, 122, 251, 1, 32, 25, 248, 11, - 66, 252, - 193, 252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, 252, 0, - 4, 252, - 0, 6, 252, 2, 119, 250, 11, 66, 252, 193, 252, 194, 252, 195, 252, 196, - 252, 197, - 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 2, 119, 250, 11, 66, 252, - 193, 252, - 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, - 6, 252, - 2, 119, 250, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, - 193, 250, 194, - 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, 2, 250, 0, 4, - 250, 0, 6, - 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 7, 119, 254, 120, 253, 121, - 255, 122, - 255, 254, 255, 0, 1, 255, 20, 66, 250, 85, 250, 87, 249, 88, 249, 89, 250, - 90, 249, - 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 222, 249, 0, - 2, 250, - 0, 4, 250, 0, 6, 250, 0, 100, 250, 0, 102, 250, 0, 122, 249, 7, 119, 254, - 120, 253, - 121, 255, 122, 255, 254, 255, 0, 1, 255, 27, 80, 250, 85, 252, 86, 250, - 87, 254, 88, - 254, 90, 254, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, - 218, 250, - 219, 250, 220, 250, 221, 250, 222, 254, 0, 78, 250, 0, 82, 250, 0, 100, - 252, 0, 102, - 252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 254, 3, - 45, 246, 47, - 246, 27, 80, 250, 85, 252, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, - 212, 250, - 213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, - 250, - 222, 254, 0, 78, 250, 0, 82, 250, 0, 100, 252, 0, 102, 252, 0, 108, 250, - 0, 112, 250, - 0, 114, 250, 0, 116, 250, 0, 122, 254, 3, 45, 246, 47, 246, 27, 80, 250, - 85, 252, 86, - 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250, 214, 250, - 215, 250, - 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0, 78, 250, 0, - 82, 250, - 0, 100, 252, 0, 102, 252, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, - 250, 0, 122, - 254, 3, 45, 246, 47, 246, 73, 45, 242, 46, 242, 47, 242, 59, 245, 60, 245, - 66, 248, - 80, 254, 98, 242, 102, 242, 106, 251, 112, 241, 115, 251, 118, 251, 120, - 251, 122, - 251, 193, 248, 194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 211, 254, - 212, - 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 242, 226, 242, 227, 242, - 228, - 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 251, - 243, - 241, 244, 241, 245, 241, 246, 241, 247, 241, 249, 241, 250, 251, 251, 251, - 252, - 251, 253, 251, 254, 251, 0, 1, 251, 0, 2, 248, 0, 3, 242, 0, 4, 248, 0, 5, - 242, 0, 6, - 248, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, - 251, 0, 78, 254, - 0, 79, 241, 0, 82, 254, 0, 83, 241, 0, 87, 251, 0, 89, 251, 0, 91, 251, 0, - 109, 251, - 0, 113, 251, 0, 115, 251, 0, 117, 251, 73, 45, 242, 46, 242, 47, 242, 59, - 245, 60, - 245, 66, 248, 80, 254, 98, 242, 102, 242, 106, 251, 112, 241, 115, 251, - 118, 251, - 120, 251, 122, 251, 193, 248, 194, 248, 195, 248, 196, 248, 197, 248, 198, - 248, - 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 242, 226, - 242, - 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 242, 236, - 248, - 238, 251, 243, 241, 244, 241, 245, 241, 246, 241, 247, 241, 249, 241, 250, - 251, - 251, 251, 252, 251, 253, 251, 254, 251, 0, 1, 251, 0, 2, 248, 0, 3, 242, - 0, 4, 248, - 0, 5, 242, 0, 6, 248, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, - 29, 242, 0, 49, - 251, 0, 78, 254, 0, 79, 241, 0, 82, 254, 0, 83, 241, 0, 87, 251, 0, 89, - 251, 0, 91, 251, - 0, 109, 251, 0, 113, 251, 0, 115, 251, 0, 117, 251, 11, 66, 249, 193, 249, - 194, 249, - 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, - 11, 66, 249, - 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 0, 2, 249, 0, - 4, 249, - 0, 6, 249, 11, 66, 249, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, - 198, 249, - 0, 2, 249, 0, 4, 249, 0, 6, 249, 11, 66, 249, 193, 249, 194, 249, 195, - 249, 196, 249, - 197, 249, 198, 249, 0, 2, 249, 0, 4, 249, 0, 6, 249, 65, 45, 242, 46, 242, - 47, 245, - 59, 242, 60, 242, 66, 245, 80, 253, 98, 242, 102, 238, 106, 248, 112, 238, - 118, 242, - 193, 245, 194, 245, 195, 245, 196, 245, 197, 245, 198, 245, 211, 253, 212, - 253, - 213, 253, 214, 253, 215, 253, 217, 253, 225, 242, 226, 242, 227, 242, 228, - 242, - 229, 242, 230, 242, 233, 245, 234, 238, 235, 245, 236, 245, 238, 248, 243, - 238, - 244, 238, 245, 238, 246, 238, 247, 238, 249, 238, 250, 242, 251, 242, 252, - 242, - 253, 242, 0, 2, 245, 0, 3, 242, 0, 4, 245, 0, 5, 242, 0, 6, 245, 0, 7, - 242, 0, 21, 245, - 0, 25, 238, 0, 27, 238, 0, 29, 238, 0, 49, 248, 0, 78, 253, 0, 79, 238, 0, - 82, 253, 0, - 83, 238, 0, 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 1, 32, 24, - 245, 17, - 33, 245, 101, 254, 115, 254, 116, 245, 117, 251, 119, 254, 0, 19, 254, 0, - 87, 254, - 0, 89, 254, 0, 91, 254, 0, 93, 245, 0, 97, 245, 0, 99, 245, 0, 101, 251, - 1, 2, 25, 245, - 1, 32, 25, 245 -}; -static afm_cuint16 afm_Times_BoldItalic_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Times_BoldItalic_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Times-Italic */ -/* FullName: Times Italic */ -/* FamilyName: Times */ -static afm_cuint8 afm_Times_Italic_widths[] = { /* 315 */ - 42, 56, 70, 83, 83, 139, 130, 36, 56, 56, 83, 113, 42, 56, 42, 46, 83, 83, - 83, 83, 83, - 83, 83, 83, 83, 83, 56, 56, 113, 113, 113, 83, 153, 102, 102, 111, 120, - 102, 102, - 120, 120, 56, 74, 111, 93, 139, 111, 120, 102, 120, 102, 83, 93, 120, 102, - 139, 102, - 93, 93, 65, 46, 65, 70, 83, 56, 83, 83, 74, 83, 74, 46, 83, 83, 46, 46, - 74, 46, 120, - 83, 83, 83, 83, 65, 65, 46, 83, 74, 111, 74, 74, 65, 67, 46, 67, 90, 65, - 83, 83, 83, - 83, 46, 83, 56, 127, 46, 83, 113, 127, 56, 67, 113, 50, 50, 56, 83, 87, - 42, 56, 50, - 52, 83, 125, 125, 125, 83, 102, 102, 102, 102, 102, 102, 148, 111, 102, - 102, 102, - 102, 56, 56, 56, 56, 120, 111, 120, 120, 120, 120, 120, 113, 120, 120, - 120, 120, - 120, 93, 102, 83, 83, 83, 83, 83, 83, 83, 111, 74, 74, 74, 74, 74, 46, 46, - 46, 46, 83, - 83, 83, 83, 83, 83, 83, 113, 83, 83, 83, 83, 83, 74, 83, 74, 102, 83, 102, - 83, 102, - 83, 111, 74, 111, 74, 120, 91, 120, 83, 102, 74, 102, 74, 102, 74, 102, - 74, 120, 83, - 120, 83, 56, 46, 56, 46, 56, 46, 111, 74, 93, 46, 93, 46, 102, 50, 93, 46, - 111, 83, - 111, 83, 111, 83, 120, 83, 120, 83, 157, 111, 102, 65, 102, 65, 102, 65, - 83, 65, 83, - 65, 83, 65, 93, 46, 93, 50, 120, 83, 120, 83, 120, 83, 120, 83, 93, 93, - 65, 93, 65, - 93, 65, 83, 83, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 148, 56, 56, 56, - 93, 93, 93, - 83, 83, 58, 148, 167, 56, 56, 28, 83, 163, 79, 102, 100, 113, 76, 92, 92, - 92, 79, 42, - 83, 83 -}; -static afm_sint16 afm_Times_Italic_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 62, 181, 0, 227, 0, 262, 0, 0, 0, 382, 497, 589, 0, 620, 644, 689, - 782, 805, 0, - 859, 1027, 1055, 1212, 0, 1367, 0, 0, 0, 0, 0, 0, 0, 1524, 1533, 1558, 0, - 1566, 1592, - 1611, 0, 0, 0, 1646, 0, 0, 1696, 1699, 0, 0, 1710, 0, 0, 0, 1822, 1827, 0, - 1832, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1837, 1956, 2075, 2194, 2313, 2432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2551, 2575, - 2620, 2665, 2710, 2755, 0, 2800, 2845, 2873, 2901, 2929, 2957, 0, 0, 3114, - 3123, - 3132, 3141, 3150, 3159, 0, 3168, 3176, 3202, 3228, 3254, 0, 0, 0, 0, 0, - 3280, 3283, - 3294, 3305, 3316, 3327, 0, 3338, 0, 0, 0, 0, 3349, 0, 3354, 3359, 3478, - 3487, 3606, - 3615, 3734, 0, 3743, 0, 3751, 3759, 0, 3794, 0, 0, 3829, 0, 3855, 0, 3881, - 0, 3907, - 0, 3933, 0, 3968, 0, 0, 0, 0, 0, 0, 4003, 4095, 4145, 0, 4176, 0, 0, 0, - 4207, 0, 4238, - 4262, 4265, 4289, 4292, 4316, 4319, 4364, 4375, 4420, 0, 0, 4431, 4485, - 4597, - 4651, 4763, 4817, 0, 0, 0, 0, 0, 0, 4929, 0, 5097, 0, 5265, 0, 5293, 0, - 5321, 0, 5349, - 0, 5377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5534, - 5539, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; -static afm_cuint8 afm_Times_Italic_kerning_data[] = { /* 5584 */ - 42, 19, 66, 254, 85, 254, 87, 251, 88, 250, 90, 244, 193, 254, 194, 254, - 195, 254, - 196, 254, 197, 254, 198, 254, 222, 244, 0, 2, 254, 0, 4, 254, 0, 6, 254, - 0, 100, 254, - 0, 102, 254, 0, 122, 244, 3, 1, 32, 25, 234, 1, 32, 29, 234, 3, 1, 32, 25, - 234, 1, 32, - 29, 234, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, - 239, 88, 241, - 90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, - 250, 213, - 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, - 252, 0, 14, - 252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, - 251, 0, 108, - 249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, - 116, 249, - 0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 20, 66, 253, 86, 255, 193, 253, - 194, 253, - 195, 253, 196, 253, 197, 253, 198, 253, 218, 255, 219, 255, 220, 255, 221, - 255, - 0, 2, 253, 0, 4, 253, 0, 6, 253, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, - 116, 255, - 16, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, 194, 251, 195, 251, 196, - 251, 197, - 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 122, 250, 52, - 45, 234, - 47, 234, 66, 238, 98, 244, 102, 244, 106, 249, 112, 239, 115, 248, 193, - 238, 194, - 238, 195, 238, 196, 238, 197, 238, 198, 238, 225, 244, 226, 244, 227, 244, - 228, - 244, 229, 244, 230, 244, 233, 244, 234, 244, 235, 244, 236, 244, 237, 249, - 238, - 249, 239, 249, 240, 249, 243, 239, 244, 239, 245, 239, 246, 239, 247, 239, - 249, - 239, 0, 2, 238, 0, 3, 244, 0, 4, 238, 0, 5, 244, 0, 6, 238, 0, 7, 244, 0, - 21, 244, 0, 25, - 244, 0, 27, 244, 0, 29, 244, 0, 45, 249, 0, 49, 249, 0, 79, 239, 0, 83, - 239, 0, 87, 248, - 0, 89, 248, 0, 91, 248, 50, 45, 253, 47, 253, 66, 250, 98, 251, 102, 253, - 112, 253, - 118, 251, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 225, - 251, - 226, 251, 227, 251, 228, 251, 229, 251, 230, 251, 233, 253, 234, 253, 235, - 253, - 236, 253, 243, 253, 244, 253, 245, 253, 246, 253, 247, 253, 249, 253, 250, - 251, - 251, 251, 252, 251, 253, 251, 0, 2, 250, 0, 3, 251, 0, 4, 250, 0, 5, 251, - 0, 6, 250, - 0, 7, 251, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0, 79, 253, 0, - 83, 253, 0, - 109, 251, 0, 113, 251, 0, 115, 251, 0, 117, 251, 40, 80, 249, 102, 251, - 112, 250, - 118, 250, 122, 250, 211, 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, - 249, - 233, 251, 234, 251, 235, 251, 236, 251, 243, 250, 244, 250, 245, 250, 246, - 250, - 247, 250, 249, 250, 250, 250, 251, 250, 252, 250, 253, 250, 254, 250, 0, - 1, 250, - 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 78, 249, 0, 79, 250, 0, - 82, 249, 0, - 83, 250, 0, 109, 250, 0, 113, 250, 0, 115, 250, 0, 117, 250, 13, 85, 254, - 87, 248, - 88, 248, 90, 254, 122, 252, 222, 254, 254, 252, 0, 1, 252, 0, 100, 254, 0, - 102, 254, - 0, 122, 254, 1, 32, 25, 251, 11, 66, 252, 193, 252, 194, 252, 195, 252, - 196, 252, - 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 20, 66, 248, 85, 250, - 87, 249, - 88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196, 248, 197, - 248, 198, - 248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0, 102, 250, - 0, 122, 249, - 41, 45, 234, 47, 234, 66, 242, 98, 244, 102, 244, 112, 244, 193, 242, 194, - 242, 195, - 242, 196, 242, 197, 242, 198, 242, 225, 244, 226, 244, 227, 244, 228, 244, - 229, - 244, 230, 244, 233, 244, 234, 244, 235, 244, 236, 244, 243, 244, 244, 244, - 245, - 244, 246, 244, 247, 244, 249, 244, 0, 2, 242, 0, 3, 244, 0, 4, 242, 0, 5, - 244, 0, 6, - 242, 0, 7, 244, 0, 21, 244, 0, 25, 244, 0, 27, 244, 0, 29, 244, 0, 79, - 244, 0, 83, 244, - 10, 86, 255, 218, 255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, - 255, 0, - 114, 255, 0, 116, 255, 24, 80, 250, 86, 250, 87, 254, 88, 254, 90, 254, - 211, 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, - 250, - 221, 250, 222, 254, 0, 78, 250, 0, 82, 250, 0, 108, 250, 0, 112, 250, 0, - 114, 250, - 0, 116, 250, 0, 122, 254, 73, 45, 245, 46, 245, 47, 245, 59, 248, 60, 246, - 66, 249, - 80, 254, 98, 242, 102, 242, 106, 248, 112, 242, 115, 248, 118, 248, 120, - 245, 122, - 245, 193, 249, 194, 249, 195, 249, 196, 249, 197, 249, 198, 249, 211, 254, - 212, - 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 242, 226, 242, 227, 242, - 228, - 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 248, 236, 248, 238, 248, - 243, - 242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 248, 251, 248, - 252, - 248, 253, 248, 254, 245, 0, 1, 251, 0, 2, 249, 0, 3, 242, 0, 4, 249, 0, 5, - 242, 0, 6, - 249, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, - 248, 0, 78, 254, - 0, 79, 242, 0, 82, 254, 0, 83, 242, 0, 87, 248, 0, 89, 248, 0, 91, 248, 0, - 109, 248, - 0, 113, 248, 0, 115, 248, 0, 117, 248, 13, 45, 253, 47, 253, 66, 250, 193, - 250, 194, - 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, - 250, 69, 45, - 235, 46, 248, 47, 235, 59, 246, 60, 245, 66, 247, 80, 252, 98, 238, 102, - 238, 106, - 245, 112, 238, 118, 245, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, - 198, - 247, 211, 252, 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 225, 238, - 226, - 238, 227, 238, 228, 238, 229, 238, 230, 238, 233, 245, 234, 238, 235, 238, - 236, - 245, 237, 251, 238, 245, 239, 251, 240, 251, 243, 238, 244, 238, 245, 238, - 246, - 238, 247, 238, 249, 238, 250, 245, 251, 245, 252, 245, 253, 245, 0, 2, - 247, 0, 3, - 238, 0, 4, 247, 0, 5, 238, 0, 6, 247, 0, 7, 238, 0, 21, 245, 0, 25, 238, - 0, 27, 238, 0, - 29, 238, 0, 45, 251, 0, 49, 245, 0, 78, 252, 0, 79, 238, 0, 82, 252, 0, - 83, 238, 0, 109, - 245, 0, 113, 245, 0, 115, 245, 0, 117, 245, 68, 45, 242, 46, 251, 47, 242, - 59, 246, - 60, 246, 66, 247, 80, 253, 98, 242, 102, 242, 106, 248, 112, 242, 118, - 248, 122, - 245, 193, 247, 194, 247, 195, 247, 196, 247, 197, 247, 198, 247, 211, 253, - 212, - 253, 213, 253, 214, 253, 215, 253, 217, 253, 225, 242, 226, 242, 227, 242, - 228, - 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, 242, 236, 248, 238, 248, - 243, - 242, 244, 242, 245, 242, 246, 242, 247, 242, 249, 242, 250, 248, 251, 248, - 252, - 248, 253, 248, 254, 245, 0, 1, 245, 0, 2, 247, 0, 3, 242, 0, 4, 247, 0, 5, - 242, 0, 6, - 247, 0, 7, 242, 0, 21, 248, 0, 25, 242, 0, 27, 242, 0, 29, 242, 0, 49, - 248, 0, 78, 253, - 0, 79, 242, 0, 82, 253, 0, 83, 242, 0, 109, 248, 0, 113, 248, 0, 115, 248, - 0, 117, 248, - 69, 45, 242, 46, 245, 47, 242, 59, 246, 60, 246, 66, 249, 80, 254, 98, - 242, 102, 242, - 106, 245, 112, 242, 118, 242, 193, 249, 194, 249, 195, 249, 196, 249, 197, - 249, - 198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, - 242, - 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, - 242, - 236, 248, 237, 251, 238, 245, 239, 251, 240, 251, 243, 242, 244, 242, 245, - 242, - 246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242, 253, 242, 0, - 2, 249, - 0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25, - 242, 0, 27, 242, - 0, 29, 242, 0, 45, 251, 0, 49, 245, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, - 83, 242, 0, - 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 4, 104, 255, 0, 33, 255, - 0, 37, 255, - 11, 47, 250, 118, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 109, - 254, 0, 113, - 254, 0, 115, 254, 0, 117, 254, 4, 105, 254, 108, 254, 0, 57, 254, 12, 45, - 255, 47, - 254, 104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254, 252, 0, 1, - 252, 0, 33, - 250, 0, 37, 250, 8, 45, 255, 47, 254, 103, 254, 106, 254, 0, 49, 254, 0, - 51, 247, 1, - 32, 25, 15, 15, 45, 255, 47, 254, 102, 255, 104, 255, 233, 255, 234, 255, - 235, 255, - 236, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 33, 255, 0, - 37, 255, 22, - 102, 255, 112, 255, 122, 255, 233, 255, 234, 255, 235, 255, 236, 255, 243, - 255, - 244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 254, 255, 0, 1, 255, 0, - 21, 255, - 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0, 83, 255, 2, 119, 250, - 5, 104, 255, - 119, 255, 0, 33, 255, 0, 37, 255, 47, 45, 238, 46, 254, 47, 238, 98, 254, - 100, 251, - 101, 251, 102, 251, 104, 251, 112, 249, 114, 251, 116, 255, 225, 254, 226, - 254, - 227, 254, 228, 254, 229, 254, 230, 254, 232, 251, 233, 251, 234, 251, 235, - 251, - 236, 251, 243, 249, 244, 249, 245, 249, 246, 249, 247, 249, 249, 249, 0, - 3, 254, - 0, 5, 254, 0, 7, 254, 0, 9, 251, 0, 15, 251, 0, 19, 251, 0, 21, 251, 0, - 25, 251, 0, 27, - 251, 0, 29, 251, 0, 33, 251, 0, 37, 251, 0, 79, 249, 0, 83, 249, 0, 93, - 255, 0, 97, 255, - 0, 99, 255, 1, 2, 25, 255, 3, 45, 245, 47, 245, 3, 45, 245, 47, 245, 3, - 45, 248, 47, - 248, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, 239, - 88, 241, 90, - 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, 250, - 213, - 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, - 252, 0, 14, - 252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, - 251, 0, 108, - 249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, - 116, 249, - 0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 50, 68, 252, 72, 251, 80, 250, - 82, 250, 85, - 251, 86, 249, 87, 239, 88, 241, 90, 248, 118, 254, 119, 248, 120, 248, - 122, 248, - 200, 252, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, - 249, - 219, 249, 220, 249, 221, 249, 222, 248, 250, 254, 251, 254, 252, 254, 253, - 254, - 254, 248, 0, 1, 248, 0, 8, 252, 0, 14, 252, 0, 32, 251, 0, 36, 251, 0, 78, - 250, 0, 82, - 250, 0, 100, 251, 0, 102, 251, 0, 108, 249, 0, 109, 254, 0, 112, 249, 0, - 113, 254, - 0, 114, 249, 0, 115, 254, 0, 116, 249, 0, 117, 254, 0, 122, 248, 1, 32, - 25, 251, 50, - 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241, - 90, 248, 118, - 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250, - 214, - 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248, - 250, - 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14, - 252, 0, 32, - 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108, - 249, 0, 109, - 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0, - 117, 254, - 0, 122, 248, 1, 32, 25, 251, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, - 251, 86, 249, - 87, 239, 88, 241, 90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, - 252, 211, - 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, - 220, - 249, 221, 249, 222, 248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, - 0, 1, - 248, 0, 8, 252, 0, 14, 252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, - 250, 0, 100, 251, - 0, 102, 251, 0, 108, 249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, - 249, 0, 115, - 254, 0, 116, 249, 0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 50, 68, 252, - 72, 251, 80, - 250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241, 90, 248, 118, 254, 119, - 248, 120, - 248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, - 217, - 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248, 250, 254, 251, 254, - 252, - 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14, 252, 0, 32, 251, 0, - 36, 251, 0, - 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108, 249, 0, 109, 254, - 0, 112, 249, - 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0, 117, 254, 0, 122, - 248, 1, 32, - 25, 251, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, - 239, 88, 241, - 90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, - 250, 213, - 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, - 252, 0, 14, - 252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, - 251, 0, 108, - 249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, - 116, 249, - 0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 11, 66, 252, 193, 252, 194, 252, - 195, 252, - 196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 20, 66, - 248, 85, 250, - 87, 249, 88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196, - 248, 197, - 248, 198, 248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0, - 102, 250, - 0, 122, 249, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, - 193, 248, 194, - 248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0, 4, - 248, 0, 6, - 248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 248, 85, 250, 87, 249, - 88, 249, - 89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196, 248, 197, 248, 198, - 248, 222, - 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0, 102, 250, 0, 122, - 249, 20, 66, - 248, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195, - 248, 196, - 248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, - 100, 250, 0, - 102, 250, 0, 122, 249, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250, - 90, 249, 193, - 248, 194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2, - 248, 0, 4, - 248, 0, 6, 248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 248, 85, - 250, 87, 249, - 88, 249, 89, 250, 90, 249, 193, 248, 194, 248, 195, 248, 196, 248, 197, - 248, 198, - 248, 222, 249, 0, 2, 248, 0, 4, 248, 0, 6, 248, 0, 100, 250, 0, 102, 250, - 0, 122, 249, - 13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, - 197, 250, - 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250, - 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, - 6, 250, - 13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, - 197, 250, - 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250, - 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, - 6, 250, - 69, 45, 242, 46, 245, 47, 242, 59, 246, 60, 246, 66, 249, 80, 254, 98, - 242, 102, 242, - 106, 245, 112, 242, 118, 242, 193, 249, 194, 249, 195, 249, 196, 249, 197, - 249, - 198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, - 242, - 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, - 242, - 236, 248, 237, 251, 238, 245, 239, 251, 240, 251, 243, 242, 244, 242, 245, - 242, - 246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242, 253, 242, 0, - 2, 249, - 0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25, - 242, 0, 27, 242, - 0, 29, 242, 0, 45, 251, 0, 49, 245, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, - 83, 242, 0, - 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 4, 104, 255, 0, 33, 255, - 0, 37, 255, - 4, 104, 255, 0, 33, 255, 0, 37, 255, 4, 104, 255, 0, 33, 255, 0, 37, 255, - 4, 104, 255, - 0, 33, 255, 0, 37, 255, 4, 104, 255, 0, 33, 255, 0, 37, 255, 4, 104, 255, - 0, 33, 255, - 0, 37, 255, 4, 105, 254, 108, 254, 0, 57, 254, 12, 45, 255, 47, 254, 104, - 250, 119, - 254, 120, 254, 121, 254, 122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, - 250, 12, - 45, 255, 47, 254, 104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254, - 252, 0, - 1, 252, 0, 33, 250, 0, 37, 250, 12, 45, 255, 47, 254, 104, 250, 119, 254, - 120, 254, - 121, 254, 122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250, 12, 45, - 255, 47, 254, - 104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254, 252, 0, 1, 252, 0, - 33, 250, - 0, 37, 250, 2, 119, 250, 5, 104, 255, 119, 255, 0, 33, 255, 0, 37, 255, 5, - 104, 255, - 119, 255, 0, 33, 255, 0, 37, 255, 5, 104, 255, 119, 255, 0, 33, 255, 0, - 37, 255, 5, - 104, 255, 119, 255, 0, 33, 255, 0, 37, 255, 5, 104, 255, 119, 255, 0, 33, - 255, 0, 37, - 255, 5, 104, 255, 119, 255, 0, 33, 255, 0, 37, 255, 3, 45, 248, 47, 248, - 3, 45, 248, - 47, 248, 50, 68, 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, - 239, 88, 241, - 90, 248, 118, 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, - 250, 213, - 250, 214, 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, - 222, - 248, 250, 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, - 252, 0, 14, - 252, 0, 32, 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, - 251, 0, 108, - 249, 0, 109, 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, - 116, 249, - 0, 117, 254, 0, 122, 248, 1, 32, 25, 251, 4, 104, 255, 0, 33, 255, 0, 37, - 255, 50, 68, - 252, 72, 251, 80, 250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241, 90, - 248, 118, - 254, 119, 248, 120, 248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250, - 214, - 250, 215, 250, 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248, - 250, - 254, 251, 254, 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14, - 252, 0, 32, - 251, 0, 36, 251, 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108, - 249, 0, 109, - 254, 0, 112, 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0, - 117, 254, - 0, 122, 248, 1, 32, 25, 251, 4, 104, 255, 0, 33, 255, 0, 37, 255, 50, 68, - 252, 72, 251, - 80, 250, 82, 250, 85, 251, 86, 249, 87, 239, 88, 241, 90, 248, 118, 254, - 119, 248, - 120, 248, 122, 248, 200, 252, 211, 250, 212, 250, 213, 250, 214, 250, 215, - 250, - 217, 250, 218, 249, 219, 249, 220, 249, 221, 249, 222, 248, 250, 254, 251, - 254, - 252, 254, 253, 254, 254, 248, 0, 1, 248, 0, 8, 252, 0, 14, 252, 0, 32, - 251, 0, 36, 251, - 0, 78, 250, 0, 82, 250, 0, 100, 251, 0, 102, 251, 0, 108, 249, 0, 109, - 254, 0, 112, - 249, 0, 113, 254, 0, 114, 249, 0, 115, 254, 0, 116, 249, 0, 117, 254, 0, - 122, 248, - 1, 32, 25, 251, 4, 104, 255, 0, 33, 255, 0, 37, 255, 4, 105, 254, 108, - 254, 0, 57, 254, - 4, 105, 254, 108, 254, 0, 57, 254, 16, 66, 251, 87, 250, 88, 250, 90, 250, - 193, 251, - 194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, - 4, 251, - 0, 6, 251, 0, 122, 250, 16, 66, 251, 87, 250, 88, 250, 90, 250, 193, 251, - 194, 251, - 195, 251, 196, 251, 197, 251, 198, 251, 222, 250, 0, 2, 251, 0, 4, 251, 0, - 6, 251, - 0, 122, 250, 12, 45, 255, 47, 254, 104, 250, 119, 254, 120, 254, 121, 254, - 122, 252, - 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250, 12, 45, 255, 47, 254, 104, - 250, 119, 254, - 120, 254, 121, 254, 122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250, - 12, 45, - 255, 47, 254, 104, 250, 119, 254, 120, 254, 121, 254, 122, 252, 254, 252, - 0, 1, 252, - 0, 33, 250, 0, 37, 250, 12, 45, 255, 47, 254, 104, 250, 119, 254, 120, - 254, 121, 254, - 122, 252, 254, 252, 0, 1, 252, 0, 33, 250, 0, 37, 250, 15, 45, 255, 47, - 254, 102, 255, - 104, 255, 233, 255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0, 25, 255, - 0, 27, 255, - 0, 29, 255, 0, 33, 255, 0, 37, 255, 15, 45, 255, 47, 254, 102, 255, 104, - 255, 233, - 255, 234, 255, 235, 255, 236, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, - 29, 255, - 0, 33, 255, 0, 37, 255, 40, 80, 249, 102, 251, 112, 250, 118, 250, 122, - 250, 211, - 249, 212, 249, 213, 249, 214, 249, 215, 249, 217, 249, 233, 251, 234, 251, - 235, - 251, 236, 251, 243, 250, 244, 250, 245, 250, 246, 250, 247, 250, 249, 250, - 250, - 250, 251, 250, 252, 250, 253, 250, 254, 250, 0, 1, 250, 0, 21, 251, 0, 25, - 251, 0, - 27, 251, 0, 29, 251, 0, 78, 249, 0, 79, 250, 0, 82, 249, 0, 83, 250, 0, - 109, 250, 0, - 113, 250, 0, 115, 250, 0, 117, 250, 22, 102, 255, 112, 255, 122, 255, 233, - 255, 234, - 255, 235, 255, 236, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247, 255, - 249, - 255, 254, 255, 0, 1, 255, 0, 21, 255, 0, 25, 255, 0, 27, 255, 0, 29, 255, - 0, 79, 255, - 0, 83, 255, 13, 85, 254, 87, 248, 88, 248, 90, 254, 122, 252, 222, 254, - 254, 252, - 0, 1, 252, 0, 100, 254, 0, 102, 254, 0, 122, 254, 1, 32, 25, 251, 13, 85, - 254, 87, 248, - 88, 248, 90, 254, 122, 252, 222, 254, 254, 252, 0, 1, 252, 0, 100, 254, 0, - 102, 254, - 0, 122, 254, 1, 32, 25, 251, 13, 85, 254, 87, 248, 88, 248, 90, 254, 122, - 252, 222, - 254, 254, 252, 0, 1, 252, 0, 100, 254, 0, 102, 254, 0, 122, 254, 1, 32, - 25, 251, 11, - 66, 252, 193, 252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, - 252, 0, - 4, 252, 0, 6, 252, 2, 119, 250, 11, 66, 252, 193, 252, 194, 252, 195, 252, - 196, 252, - 197, 252, 198, 252, 0, 2, 252, 0, 4, 252, 0, 6, 252, 2, 119, 250, 11, 66, - 252, 193, - 252, 194, 252, 195, 252, 196, 252, 197, 252, 198, 252, 0, 2, 252, 0, 4, - 252, 0, 6, - 252, 2, 119, 250, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250, 90, - 249, 193, 248, - 194, 248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0, - 4, 248, - 0, 6, 248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 5, 104, 255, 119, 255, - 0, 33, 255, - 0, 37, 255, 20, 66, 248, 85, 250, 87, 249, 88, 249, 89, 250, 90, 249, 193, - 248, 194, - 248, 195, 248, 196, 248, 197, 248, 198, 248, 222, 249, 0, 2, 248, 0, 4, - 248, 0, 6, - 248, 0, 100, 250, 0, 102, 250, 0, 122, 249, 5, 104, 255, 119, 255, 0, 33, - 255, 0, 37, - 255, 24, 80, 250, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, - 213, 250, - 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, - 254, - 0, 78, 250, 0, 82, 250, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, - 250, 0, 122, - 254, 47, 45, 238, 46, 254, 47, 238, 98, 254, 100, 251, 101, 251, 102, 251, - 104, 251, - 112, 249, 114, 251, 116, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, - 254, - 230, 254, 232, 251, 233, 251, 234, 251, 235, 251, 236, 251, 243, 249, 244, - 249, - 245, 249, 246, 249, 247, 249, 249, 249, 0, 3, 254, 0, 5, 254, 0, 7, 254, - 0, 9, 251, - 0, 15, 251, 0, 19, 251, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, - 33, 251, 0, - 37, 251, 0, 79, 249, 0, 83, 249, 0, 93, 255, 0, 97, 255, 0, 99, 255, 1, 2, - 25, 255, 24, - 80, 250, 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250, - 214, 250, - 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0, - 78, 250, - 0, 82, 250, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, - 254, 47, 45, - 238, 46, 254, 47, 238, 98, 254, 100, 251, 101, 251, 102, 251, 104, 251, - 112, 249, - 114, 251, 116, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, - 254, - 232, 251, 233, 251, 234, 251, 235, 251, 236, 251, 243, 249, 244, 249, 245, - 249, - 246, 249, 247, 249, 249, 249, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 9, 251, - 0, 15, 251, - 0, 19, 251, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 33, 251, 0, - 37, 251, 0, - 79, 249, 0, 83, 249, 0, 93, 255, 0, 97, 255, 0, 99, 255, 1, 2, 25, 255, - 24, 80, 250, - 86, 250, 87, 254, 88, 254, 90, 254, 211, 250, 212, 250, 213, 250, 214, - 250, 215, - 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 254, 0, 78, - 250, 0, 82, - 250, 0, 108, 250, 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 254, 47, - 45, 238, - 46, 254, 47, 238, 98, 254, 100, 251, 101, 251, 102, 251, 104, 251, 112, - 249, 114, - 251, 116, 255, 225, 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, - 232, - 251, 233, 251, 234, 251, 235, 251, 236, 251, 243, 249, 244, 249, 245, 249, - 246, - 249, 247, 249, 249, 249, 0, 3, 254, 0, 5, 254, 0, 7, 254, 0, 9, 251, 0, - 15, 251, 0, 19, - 251, 0, 21, 251, 0, 25, 251, 0, 27, 251, 0, 29, 251, 0, 33, 251, 0, 37, - 251, 0, 79, 249, - 0, 83, 249, 0, 93, 255, 0, 97, 255, 0, 99, 255, 1, 2, 25, 255, 73, 45, - 245, 46, 245, - 47, 245, 59, 248, 60, 246, 66, 249, 80, 254, 98, 242, 102, 242, 106, 248, - 112, 242, - 115, 248, 118, 248, 120, 245, 122, 245, 193, 249, 194, 249, 195, 249, 196, - 249, - 197, 249, 198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, - 254, - 225, 242, 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, - 242, - 235, 248, 236, 248, 238, 248, 243, 242, 244, 242, 245, 242, 246, 242, 247, - 242, - 249, 242, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0, 1, 251, 0, - 2, 249, - 0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25, - 242, 0, 27, 242, - 0, 29, 242, 0, 49, 248, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, 83, 242, 0, - 87, 248, 0, - 89, 248, 0, 91, 248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, 117, 248, - 73, 45, 245, - 46, 245, 47, 245, 59, 248, 60, 246, 66, 249, 80, 254, 98, 242, 102, 242, - 106, 248, - 112, 242, 115, 248, 118, 248, 120, 245, 122, 245, 193, 249, 194, 249, 195, - 249, - 196, 249, 197, 249, 198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, - 254, - 217, 254, 225, 242, 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, - 248, - 234, 242, 235, 248, 236, 248, 238, 248, 243, 242, 244, 242, 245, 242, 246, - 242, - 247, 242, 249, 242, 250, 248, 251, 248, 252, 248, 253, 248, 254, 245, 0, - 1, 251, - 0, 2, 249, 0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, - 248, 0, 25, 242, - 0, 27, 242, 0, 29, 242, 0, 49, 248, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, - 83, 242, 0, - 87, 248, 0, 89, 248, 0, 91, 248, 0, 109, 248, 0, 113, 248, 0, 115, 248, 0, - 117, 248, - 13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, - 197, 250, - 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250, - 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, - 6, 250, - 13, 45, 253, 47, 253, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, - 197, 250, - 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 13, 45, 253, 47, 253, 66, 250, - 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, - 6, 250, - 69, 45, 242, 46, 245, 47, 242, 59, 246, 60, 246, 66, 249, 80, 254, 98, - 242, 102, 242, - 106, 245, 112, 242, 118, 242, 193, 249, 194, 249, 195, 249, 196, 249, 197, - 249, - 198, 249, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, - 242, - 226, 242, 227, 242, 228, 242, 229, 242, 230, 242, 233, 248, 234, 242, 235, - 242, - 236, 248, 237, 251, 238, 245, 239, 251, 240, 251, 243, 242, 244, 242, 245, - 242, - 246, 242, 247, 242, 249, 242, 250, 242, 251, 242, 252, 242, 253, 242, 0, - 2, 249, - 0, 3, 242, 0, 4, 249, 0, 5, 242, 0, 6, 249, 0, 7, 242, 0, 21, 248, 0, 25, - 242, 0, 27, 242, - 0, 29, 242, 0, 45, 251, 0, 49, 245, 0, 78, 254, 0, 79, 242, 0, 82, 254, 0, - 83, 242, 0, - 109, 242, 0, 113, 242, 0, 115, 242, 0, 117, 242, 2, 1, 32, 24, 238, 17, - 33, 238, 101, - 253, 115, 253, 116, 250, 117, 252, 119, 255, 0, 19, 253, 0, 87, 253, 0, - 89, 253, 0, - 91, 253, 0, 93, 250, 0, 97, 250, 0, 99, 250, 0, 101, 252, 1, 2, 25, 250, - 1, 32, 25, 238 -}; -static afm_cuint16 afm_Times_Italic_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Times_Italic_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; - - -/* ------------------------------------------------------------------*/ -/* FontName: Times-Roman */ -/* FullName: Times Roman */ -/* FamilyName: Times */ -static afm_cuint8 afm_Times_Roman_widths[] = { /* 315 */ - 42, 56, 68, 83, 83, 139, 130, 30, 56, 56, 83, 94, 42, 56, 42, 46, 83, 83, - 83, 83, 83, - 83, 83, 83, 83, 83, 46, 46, 94, 94, 94, 74, 154, 120, 111, 111, 120, 102, - 93, 120, - 120, 56, 65, 120, 102, 148, 120, 120, 93, 120, 111, 93, 102, 120, 120, - 157, 120, - 120, 102, 56, 46, 56, 78, 83, 56, 74, 83, 74, 83, 74, 56, 83, 83, 46, 46, - 83, 46, 130, - 83, 83, 83, 83, 56, 65, 46, 83, 83, 120, 83, 83, 74, 80, 33, 80, 90, 56, - 83, 83, 83, - 83, 33, 83, 56, 127, 46, 83, 94, 127, 56, 67, 94, 50, 50, 56, 83, 76, 42, - 56, 50, 52, - 83, 125, 125, 125, 74, 120, 120, 120, 120, 120, 120, 148, 111, 102, 102, - 102, 102, - 56, 56, 56, 56, 120, 120, 120, 120, 120, 120, 120, 94, 120, 120, 120, 120, - 120, 120, - 93, 83, 74, 74, 74, 74, 74, 74, 111, 74, 74, 74, 74, 74, 46, 46, 46, 46, - 83, 83, 83, - 83, 83, 83, 83, 94, 83, 83, 83, 83, 83, 83, 83, 83, 120, 74, 120, 74, 120, - 74, 111, - 74, 111, 74, 120, 98, 120, 83, 102, 74, 102, 74, 102, 74, 102, 74, 120, - 83, 120, 83, - 56, 46, 56, 46, 56, 46, 120, 83, 102, 46, 102, 46, 102, 57, 102, 46, 120, - 83, 120, - 83, 120, 83, 120, 83, 120, 83, 148, 120, 111, 56, 111, 56, 111, 56, 93, - 65, 93, 65, - 93, 65, 102, 46, 102, 54, 120, 83, 120, 83, 120, 83, 120, 83, 120, 102, - 74, 102, 74, - 102, 74, 83, 93, 65, 56, 56, 56, 56, 56, 56, 56, 56, 83, 167, 56, 56, 56, - 74, 74, 74, - 83, 83, 58, 167, 167, 56, 56, 28, 83, 163, 79, 102, 100, 94, 76, 92, 92, - 92, 79, 42, - 93, 93 -}; -static afm_sint16 afm_Times_Roman_kerning_index[] = { /* 315 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 62, 159, 0, 205, 0, 240, 0, 0, 0, 311, 335, 427, 0, 458, 482, 527, - 578, 601, 0, - 663, 831, 855, 1020, 0, 1175, 0, 0, 0, 0, 0, 0, 0, 1323, 1328, 1355, 0, - 1363, 1385, - 0, 0, 1422, 0, 1425, 1475, 0, 1478, 1488, 1500, 0, 1508, 0, 0, 0, 1523, - 1593, 1641, - 1664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1669, 1766, 1863, 1960, 2057, 2154, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2251, - 2275, 2320, 2365, 2410, 2455, 0, 2500, 2545, 2569, 2593, 2617, 2641, 0, 0, - 2789, - 2794, 2799, 2804, 2809, 2814, 0, 2819, 2827, 2849, 2871, 2893, 2915, 2918, - 2921, - 2924, 0, 2927, 2937, 2949, 2961, 2973, 2985, 0, 2997, 0, 0, 0, 0, 3009, 0, - 3014, - 3019, 3116, 3121, 3218, 3223, 3320, 0, 3325, 0, 3333, 3341, 0, 3376, 0, 0, - 3411, - 0, 3433, 0, 3455, 0, 3477, 0, 0, 0, 0, 0, 3499, 0, 3502, 0, 0, 3505, 3597, - 3647, 3678, - 3681, 3712, 3715, 0, 3727, 3758, 3761, 3785, 3795, 3819, 3829, 3853, 3863, - 3908, - 3920, 3965, 0, 0, 3977, 4039, 4054, 4116, 4131, 4193, 0, 0, 0, 0, 0, 0, - 4208, 0, 4376, - 0, 4544, 0, 4568, 0, 4592, 0, 4616, 0, 4640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4788, 4816, 0, 4872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; -static afm_cuint8 afm_Times_Roman_kerning_data[] = { /* 4896 */ - 42, 19, 66, 248, 85, 254, 87, 249, 88, 252, 90, 242, 193, 248, 194, 248, - 195, 248, - 196, 248, 197, 248, 198, 248, 222, 242, 0, 2, 248, 0, 4, 248, 0, 6, 248, - 0, 100, 254, - 0, 102, 254, 0, 122, 242, 3, 1, 32, 25, 245, 1, 32, 29, 245, 3, 1, 32, 25, - 245, 1, 32, - 29, 245, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, - 234, 88, 242, - 90, 239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213, - 248, 214, - 248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, - 254, - 242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, - 0, 82, 248, - 0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, - 248, 0, 122, - 239, 1, 32, 25, 238, 20, 66, 251, 86, 255, 193, 251, 194, 251, 195, 251, - 196, 251, - 197, 251, 198, 251, 218, 255, 219, 255, 220, 255, 221, 255, 0, 2, 251, 0, - 4, 251, - 0, 6, 251, 0, 108, 255, 0, 112, 255, 0, 114, 255, 0, 116, 255, 16, 66, - 250, 87, 250, - 88, 252, 90, 248, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, - 250, 222, - 248, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 248, 32, 45, 244, 47, 244, - 66, 245, 98, - 254, 112, 254, 193, 245, 194, 245, 195, 245, 196, 245, 197, 245, 198, 245, - 225, - 254, 226, 254, 227, 254, 228, 254, 229, 254, 230, 254, 243, 254, 244, 254, - 245, - 254, 246, 254, 247, 254, 249, 254, 0, 2, 245, 0, 3, 254, 0, 4, 245, 0, 5, - 254, 0, 6, - 245, 0, 7, 254, 0, 79, 254, 0, 83, 254, 11, 66, 247, 193, 247, 194, 247, - 195, 247, - 196, 247, 197, 247, 198, 247, 0, 2, 247, 0, 4, 247, 0, 6, 247, 40, 80, - 252, 102, 253, - 112, 251, 118, 254, 122, 253, 211, 252, 212, 252, 213, 252, 214, 252, 215, - 252, - 217, 252, 233, 253, 234, 253, 235, 253, 236, 253, 243, 251, 244, 251, 245, - 251, - 246, 251, 247, 251, 249, 251, 250, 254, 251, 254, 252, 254, 253, 254, 254, - 253, - 0, 1, 253, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, 0, 78, 252, 0, - 79, 251, 0, - 82, 252, 0, 83, 251, 0, 109, 254, 0, 113, 254, 0, 115, 254, 0, 117, 254, - 13, 85, 242, - 87, 240, 88, 245, 90, 240, 122, 248, 222, 240, 254, 248, 0, 1, 248, 0, - 100, 242, 0, - 102, 242, 0, 122, 240, 1, 32, 25, 242, 11, 66, 251, 193, 251, 194, 251, - 195, 251, - 196, 251, 197, 251, 198, 251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 20, 66, - 251, 85, 250, - 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195, 251, 196, - 251, 197, - 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 100, 250, 0, - 102, 250, - 0, 122, 249, 23, 45, 238, 47, 238, 66, 242, 98, 254, 193, 242, 194, 242, - 195, 242, - 196, 242, 197, 242, 198, 242, 225, 254, 226, 254, 227, 254, 228, 254, 229, - 254, - 230, 254, 0, 2, 242, 0, 3, 254, 0, 4, 242, 0, 5, 254, 0, 6, 242, 0, 7, - 254, 10, 86, 255, - 218, 255, 219, 255, 220, 255, 221, 255, 0, 108, 255, 0, 112, 255, 0, 114, - 255, 0, - 116, 255, 27, 80, 250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246, 211, - 250, 212, - 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, - 221, - 250, 222, 246, 0, 78, 250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0, 108, - 250, 0, 112, - 250, 0, 114, 250, 0, 116, 250, 0, 122, 246, 73, 45, 245, 46, 242, 47, 245, - 59, 249, - 60, 248, 66, 241, 80, 254, 98, 244, 102, 245, 106, 251, 112, 244, 115, - 251, 118, - 249, 120, 244, 122, 244, 193, 241, 194, 241, 195, 241, 196, 241, 197, 241, - 198, - 241, 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, - 226, - 244, 227, 244, 228, 250, 229, 250, 230, 244, 233, 245, 234, 245, 235, 245, - 236, - 252, 238, 251, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, - 250, - 249, 251, 249, 252, 249, 253, 249, 254, 244, 0, 1, 244, 0, 2, 241, 0, 3, - 250, 0, 4, - 241, 0, 5, 244, 0, 6, 241, 0, 7, 244, 0, 21, 252, 0, 25, 245, 0, 27, 245, - 0, 29, 245, - 0, 49, 251, 0, 78, 254, 0, 79, 244, 0, 82, 254, 0, 83, 244, 0, 87, 251, 0, - 89, 251, 0, - 91, 251, 0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249, 11, 66, 250, - 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, - 6, 250, - 72, 45, 235, 46, 240, 47, 235, 59, 245, 60, 245, 66, 234, 72, 254, 80, - 250, 98, 238, - 102, 238, 106, 247, 112, 235, 118, 244, 193, 234, 194, 234, 195, 234, 196, - 234, - 197, 234, 198, 234, 211, 250, 212, 250, 213, 250, 214, 250, 215, 250, 217, - 250, - 225, 245, 226, 238, 227, 245, 228, 245, 229, 245, 230, 238, 233, 245, 234, - 238, - 235, 245, 236, 245, 237, 254, 238, 247, 239, 254, 240, 254, 243, 242, 244, - 235, - 245, 235, 246, 242, 247, 242, 249, 235, 250, 244, 251, 244, 252, 244, 253, - 244, - 0, 2, 234, 0, 3, 245, 0, 4, 234, 0, 5, 238, 0, 6, 234, 0, 7, 238, 0, 21, - 245, 0, 25, 238, - 0, 27, 238, 0, 29, 245, 0, 32, 254, 0, 36, 254, 0, 45, 254, 0, 49, 247, 0, - 78, 250, 0, - 79, 242, 0, 82, 250, 0, 83, 235, 0, 109, 244, 0, 113, 244, 0, 115, 244, 0, - 117, 244, - 68, 45, 242, 46, 246, 47, 242, 59, 251, 60, 251, 66, 237, 80, 255, 98, - 244, 102, 244, - 106, 250, 112, 244, 118, 249, 122, 245, 193, 237, 194, 237, 195, 237, 196, - 237, - 197, 237, 198, 237, 211, 255, 212, 255, 213, 255, 214, 255, 215, 255, 217, - 255, - 225, 244, 226, 244, 227, 244, 228, 244, 229, 244, 230, 244, 233, 250, 234, - 244, - 235, 244, 236, 250, 238, 250, 243, 244, 244, 244, 245, 244, 246, 244, 247, - 244, - 249, 244, 250, 249, 251, 249, 252, 249, 253, 249, 254, 245, 0, 1, 245, 0, - 2, 237, - 0, 3, 244, 0, 4, 237, 0, 5, 244, 0, 6, 237, 0, 7, 244, 0, 21, 250, 0, 25, - 244, 0, 27, 244, - 0, 29, 244, 0, 49, 250, 0, 78, 255, 0, 79, 244, 0, 82, 255, 0, 83, 244, 0, - 109, 249, - 0, 113, 249, 0, 115, 249, 0, 117, 249, 65, 45, 235, 46, 238, 47, 235, 59, - 242, 60, - 242, 66, 237, 80, 252, 98, 240, 102, 240, 106, 248, 112, 239, 118, 238, - 193, 237, - 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, 252, 212, 252, 213, - 252, - 214, 252, 215, 252, 217, 252, 225, 247, 226, 240, 227, 240, 228, 247, 229, - 247, - 230, 240, 233, 247, 234, 240, 235, 240, 236, 247, 238, 248, 243, 245, 244, - 239, - 245, 239, 246, 245, 247, 245, 249, 239, 250, 245, 251, 238, 252, 238, 253, - 245, - 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 240, 0, 6, 237, 0, 7, 240, 0, 21, - 247, 0, 25, 240, - 0, 27, 240, 0, 29, 240, 0, 49, 248, 0, 78, 252, 0, 79, 245, 0, 82, 252, 0, - 83, 239, 0, - 109, 245, 0, 113, 238, 0, 115, 238, 0, 117, 238, 3, 119, 254, 120, 254, - 12, 47, 250, - 118, 254, 119, 254, 250, 254, 251, 254, 252, 254, 253, 254, 0, 109, 254, - 0, 113, - 254, 0, 115, 254, 0, 117, 254, 4, 122, 254, 254, 254, 0, 1, 254, 10, 104, - 254, 119, - 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 254, 0, 37, - 254, 16, - 98, 255, 103, 253, 106, 254, 225, 255, 226, 255, 227, 255, 228, 255, 229, - 255, 230, - 255, 238, 254, 0, 3, 255, 0, 5, 255, 0, 7, 255, 0, 51, 249, 1, 32, 25, 9, - 2, 119, 253, - 22, 102, 255, 112, 255, 122, 254, 233, 255, 234, 255, 235, 255, 236, 255, - 243, 255, - 244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 254, 254, 0, 1, 254, 0, - 21, 255, - 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0, 83, 255, 2, 120, 255, - 5, 119, 250, - 122, 254, 254, 254, 0, 1, 254, 6, 119, 254, 120, 253, 122, 255, 254, 255, - 0, 1, 255, - 4, 122, 255, 254, 255, 0, 1, 255, 7, 45, 250, 46, 254, 47, 248, 104, 254, - 0, 33, 254, - 0, 37, 254, 31, 45, 246, 47, 246, 98, 253, 102, 254, 112, 254, 225, 253, - 226, 253, - 227, 253, 228, 253, 229, 253, 230, 253, 233, 254, 234, 254, 235, 254, 236, - 254, - 243, 254, 244, 254, 245, 254, 246, 254, 247, 254, 249, 254, 0, 3, 253, 0, - 5, 253, - 0, 7, 253, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 0, 79, 254, 0, - 83, 254, 22, - 45, 246, 47, 246, 98, 255, 112, 255, 225, 255, 226, 255, 227, 255, 228, - 255, 229, - 255, 230, 255, 243, 255, 244, 255, 245, 255, 246, 255, 247, 255, 249, 255, - 0, 3, - 255, 0, 5, 255, 0, 7, 255, 0, 79, 255, 0, 83, 255, 10, 102, 254, 233, 254, - 234, 254, - 235, 254, 236, 254, 0, 21, 254, 0, 25, 254, 0, 27, 254, 0, 29, 254, 3, 45, - 246, 47, - 246, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234, - 88, 242, 90, - 239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213, 248, - 214, - 248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, - 254, - 242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, - 0, 82, 248, - 0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, - 248, 0, 122, - 239, 1, 32, 25, 238, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, - 248, 87, - 234, 88, 242, 90, 239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, - 212, 248, - 213, 248, 214, 248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, - 248, - 222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, - 250, 0, 78, - 248, 0, 82, 248, 0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, - 114, 248, 0, - 116, 248, 0, 122, 239, 1, 32, 25, 238, 41, 68, 250, 72, 250, 80, 248, 82, - 248, 85, - 238, 86, 248, 87, 234, 88, 242, 90, 239, 119, 245, 120, 242, 122, 242, - 200, 250, - 211, 248, 212, 248, 213, 248, 214, 248, 215, 248, 217, 248, 218, 248, 219, - 248, - 220, 248, 221, 248, 222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0, 14, 250, - 0, 32, 250, - 0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100, 238, 0, 102, 238, 0, 108, 248, - 0, 112, 248, - 0, 114, 248, 0, 116, 248, 0, 122, 239, 1, 32, 25, 238, 41, 68, 250, 72, - 250, 80, 248, - 82, 248, 85, 238, 86, 248, 87, 234, 88, 242, 90, 239, 119, 245, 120, 242, - 122, 242, - 200, 250, 211, 248, 212, 248, 213, 248, 214, 248, 215, 248, 217, 248, 218, - 248, - 219, 248, 220, 248, 221, 248, 222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0, - 14, 250, - 0, 32, 250, 0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100, 238, 0, 102, 238, - 0, 108, 248, - 0, 112, 248, 0, 114, 248, 0, 116, 248, 0, 122, 239, 1, 32, 25, 238, 41, - 68, 250, 72, - 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234, 88, 242, 90, 239, 119, - 245, 120, - 242, 122, 242, 200, 250, 211, 248, 212, 248, 213, 248, 214, 248, 215, 248, - 217, - 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, 254, 242, 0, 1, - 242, 0, 8, - 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100, - 238, 0, 102, - 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, 248, 0, 122, 239, 1, - 32, 25, 238, - 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234, 88, - 242, 90, 239, - 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213, 248, 214, - 248, - 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, 254, - 242, - 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, 0, - 82, 248, 0, 100, - 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, 248, 0, - 122, 239, - 1, 32, 25, 238, 11, 66, 251, 193, 251, 194, 251, 195, 251, 196, 251, 197, - 251, 198, - 251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 20, 66, 251, 85, 250, 87, 249, 88, - 251, 89, 250, - 90, 249, 193, 251, 194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222, - 249, 0, - 2, 251, 0, 4, 251, 0, 6, 251, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, - 66, 251, 85, - 250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195, 251, - 196, 251, - 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 100, - 250, 0, 102, - 250, 0, 122, 249, 20, 66, 251, 85, 250, 87, 249, 88, 251, 89, 250, 90, - 249, 193, 251, - 194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, - 4, 251, - 0, 6, 251, 0, 100, 250, 0, 102, 250, 0, 122, 249, 20, 66, 251, 85, 250, - 87, 249, 88, - 251, 89, 250, 90, 249, 193, 251, 194, 251, 195, 251, 196, 251, 197, 251, - 198, 251, - 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, 100, 250, 0, 102, 250, 0, - 122, 249, 20, - 66, 251, 85, 250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, - 195, 251, - 196, 251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, - 0, 100, 250, - 0, 102, 250, 0, 122, 249, 20, 66, 251, 85, 250, 87, 249, 88, 251, 89, 250, - 90, 249, - 193, 251, 194, 251, 195, 251, 196, 251, 197, 251, 198, 251, 222, 249, 0, - 2, 251, - 0, 4, 251, 0, 6, 251, 0, 100, 250, 0, 102, 250, 0, 122, 249, 11, 66, 250, - 193, 250, - 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, - 6, 250, - 11, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, - 0, 2, 250, - 0, 4, 250, 0, 6, 250, 11, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, - 197, 250, - 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 11, 66, 250, 193, 250, 194, - 250, 195, 250, - 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45, - 235, 46, 238, - 47, 235, 59, 242, 60, 242, 66, 237, 80, 252, 98, 240, 102, 240, 106, 248, - 112, 239, - 118, 238, 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, - 252, - 212, 252, 213, 252, 214, 252, 215, 252, 217, 252, 225, 247, 226, 240, 227, - 240, - 228, 247, 229, 247, 230, 240, 233, 247, 234, 240, 235, 240, 236, 247, 238, - 248, - 243, 245, 244, 239, 245, 239, 246, 245, 247, 245, 249, 239, 250, 245, 251, - 238, - 252, 238, 253, 245, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 240, 0, 6, 237, - 0, 7, 240, - 0, 21, 247, 0, 25, 240, 0, 27, 240, 0, 29, 240, 0, 49, 248, 0, 78, 252, 0, - 79, 245, 0, - 82, 252, 0, 83, 239, 0, 109, 245, 0, 113, 238, 0, 115, 238, 0, 117, 238, - 3, 119, 254, - 120, 254, 3, 119, 254, 120, 254, 3, 119, 254, 120, 254, 3, 119, 254, 120, - 254, 3, - 119, 254, 120, 254, 3, 119, 254, 120, 254, 4, 122, 254, 254, 254, 0, 1, - 254, 10, 104, - 254, 119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, - 254, 0, 37, - 254, 10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, - 254, 0, - 33, 254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254, - 254, 254, - 0, 1, 254, 0, 33, 254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121, - 254, 122, - 254, 254, 254, 0, 1, 254, 0, 33, 254, 0, 37, 254, 2, 119, 253, 2, 119, - 253, 2, 119, - 253, 2, 119, 253, 5, 119, 250, 122, 254, 254, 254, 0, 1, 254, 6, 119, 254, - 120, 253, - 122, 255, 254, 255, 0, 1, 255, 6, 119, 254, 120, 253, 122, 255, 254, 255, - 0, 1, 255, - 6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1, 255, 6, 119, 254, 120, - 253, 122, - 255, 254, 255, 0, 1, 255, 6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1, - 255, 6, - 119, 254, 120, 253, 122, 255, 254, 255, 0, 1, 255, 3, 45, 246, 47, 246, 3, - 45, 246, - 47, 246, 41, 68, 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, - 234, 88, 242, - 90, 239, 119, 245, 120, 242, 122, 242, 200, 250, 211, 248, 212, 248, 213, - 248, 214, - 248, 215, 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, - 254, - 242, 0, 1, 242, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, - 0, 82, 248, - 0, 100, 238, 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, - 248, 0, 122, - 239, 1, 32, 25, 238, 3, 119, 254, 120, 254, 41, 68, 250, 72, 250, 80, 248, - 82, 248, - 85, 238, 86, 248, 87, 234, 88, 242, 90, 239, 119, 245, 120, 242, 122, 242, - 200, 250, - 211, 248, 212, 248, 213, 248, 214, 248, 215, 248, 217, 248, 218, 248, 219, - 248, - 220, 248, 221, 248, 222, 239, 254, 242, 0, 1, 242, 0, 8, 250, 0, 14, 250, - 0, 32, 250, - 0, 36, 250, 0, 78, 248, 0, 82, 248, 0, 100, 238, 0, 102, 238, 0, 108, 248, - 0, 112, 248, - 0, 114, 248, 0, 116, 248, 0, 122, 239, 1, 32, 25, 238, 3, 119, 254, 120, - 254, 41, 68, - 250, 72, 250, 80, 248, 82, 248, 85, 238, 86, 248, 87, 234, 88, 242, 90, - 239, 119, - 245, 120, 248, 122, 248, 200, 250, 211, 248, 212, 248, 213, 248, 214, 248, - 215, - 248, 217, 248, 218, 248, 219, 248, 220, 248, 221, 248, 222, 239, 254, 248, - 0, 1, - 248, 0, 8, 250, 0, 14, 250, 0, 32, 250, 0, 36, 250, 0, 78, 248, 0, 82, - 248, 0, 100, 238, - 0, 102, 238, 0, 108, 248, 0, 112, 248, 0, 114, 248, 0, 116, 248, 0, 122, - 239, 1, 32, - 25, 238, 3, 119, 254, 120, 254, 4, 122, 254, 254, 254, 0, 1, 254, 4, 122, - 254, 254, - 254, 0, 1, 254, 16, 66, 250, 87, 250, 88, 252, 90, 248, 193, 250, 194, - 250, 195, 250, - 196, 250, 197, 250, 198, 250, 222, 248, 0, 2, 250, 0, 4, 250, 0, 6, 250, - 0, 122, 248, - 16, 66, 250, 87, 250, 88, 252, 90, 248, 193, 250, 194, 250, 195, 250, 196, - 250, 197, - 250, 198, 250, 222, 248, 0, 2, 250, 0, 4, 250, 0, 6, 250, 0, 122, 248, 10, - 104, 254, - 119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254, 0, 33, 254, - 0, 37, 254, - 10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254, 254, 254, 0, 1, 254, - 0, 33, - 254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121, 254, 122, 254, - 254, 254, - 0, 1, 254, 0, 33, 254, 0, 37, 254, 10, 104, 254, 119, 253, 120, 253, 121, - 254, 122, - 254, 254, 254, 0, 1, 254, 0, 33, 254, 0, 37, 254, 2, 119, 253, 2, 119, - 253, 40, 80, - 252, 102, 253, 112, 251, 118, 254, 122, 253, 211, 252, 212, 252, 213, 252, - 214, - 252, 215, 252, 217, 252, 233, 253, 234, 253, 235, 253, 236, 253, 243, 251, - 244, - 251, 245, 251, 246, 251, 247, 251, 249, 251, 250, 254, 251, 254, 252, 254, - 253, - 254, 254, 253, 0, 1, 253, 0, 21, 253, 0, 25, 253, 0, 27, 253, 0, 29, 253, - 0, 78, 252, - 0, 79, 251, 0, 82, 252, 0, 83, 251, 0, 109, 254, 0, 113, 254, 0, 115, 254, - 0, 117, 254, - 22, 102, 255, 112, 255, 122, 254, 233, 255, 234, 255, 235, 255, 236, 255, - 243, 255, - 244, 255, 245, 255, 246, 255, 247, 255, 249, 255, 254, 254, 0, 1, 254, 0, - 21, 255, - 0, 25, 255, 0, 27, 255, 0, 29, 255, 0, 79, 255, 0, 83, 255, 13, 85, 242, - 87, 240, 88, - 245, 90, 240, 122, 248, 222, 240, 254, 248, 0, 1, 248, 0, 100, 242, 0, - 102, 242, 0, - 122, 240, 1, 32, 25, 242, 2, 120, 255, 13, 85, 242, 87, 240, 88, 245, 90, - 240, 122, - 248, 222, 240, 254, 248, 0, 1, 248, 0, 100, 242, 0, 102, 242, 0, 122, 240, - 1, 32, 25, - 242, 2, 120, 255, 5, 122, 248, 254, 248, 0, 1, 248, 1, 32, 25, 242, 13, - 85, 242, 87, - 240, 88, 245, 90, 240, 122, 248, 222, 240, 254, 248, 0, 1, 248, 0, 100, - 242, 0, 102, - 242, 0, 122, 240, 1, 32, 25, 242, 2, 120, 255, 11, 66, 251, 193, 251, 194, - 251, 195, - 251, 196, 251, 197, 251, 198, 251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 5, - 119, 250, 122, - 254, 254, 254, 0, 1, 254, 11, 66, 251, 193, 251, 194, 251, 195, 251, 196, - 251, 197, - 251, 198, 251, 0, 2, 251, 0, 4, 251, 0, 6, 251, 5, 119, 250, 122, 254, - 254, 254, 0, - 1, 254, 11, 66, 251, 193, 251, 194, 251, 195, 251, 196, 251, 197, 251, - 198, 251, - 0, 2, 251, 0, 4, 251, 0, 6, 251, 5, 119, 250, 122, 254, 254, 254, 0, 1, - 254, 20, 66, - 251, 85, 250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195, - 251, 196, - 251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, - 100, 250, 0, - 102, 250, 0, 122, 249, 6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1, - 255, 20, 66, - 251, 85, 250, 87, 249, 88, 251, 89, 250, 90, 249, 193, 251, 194, 251, 195, - 251, 196, - 251, 197, 251, 198, 251, 222, 249, 0, 2, 251, 0, 4, 251, 0, 6, 251, 0, - 100, 250, 0, - 102, 250, 0, 122, 249, 6, 119, 254, 120, 253, 122, 255, 254, 255, 0, 1, - 255, 27, 80, - 250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246, 211, 250, 212, 250, 213, - 250, 214, - 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, 222, 246, - 0, 78, - 250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0, 108, 250, 0, 112, 250, 0, - 114, 250, 0, - 116, 250, 0, 122, 246, 7, 45, 250, 46, 254, 47, 248, 104, 254, 0, 33, 254, - 0, 37, 254, - 27, 80, 250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246, 211, 250, 212, - 250, 213, - 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, 250, 221, 250, - 222, - 246, 0, 78, 250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0, 108, 250, 0, - 112, 250, 0, - 114, 250, 0, 116, 250, 0, 122, 246, 7, 45, 250, 46, 254, 47, 248, 104, - 254, 0, 33, - 254, 0, 37, 254, 27, 80, 250, 85, 247, 86, 250, 87, 244, 88, 248, 90, 246, - 211, 250, - 212, 250, 213, 250, 214, 250, 215, 250, 217, 250, 218, 250, 219, 250, 220, - 250, - 221, 250, 222, 246, 0, 78, 250, 0, 82, 250, 0, 100, 247, 0, 102, 247, 0, - 108, 250, - 0, 112, 250, 0, 114, 250, 0, 116, 250, 0, 122, 246, 7, 45, 250, 46, 254, - 47, 248, 104, - 254, 0, 33, 254, 0, 37, 254, 73, 45, 245, 46, 242, 47, 245, 59, 249, 60, - 248, 66, 241, - 80, 254, 98, 244, 102, 245, 106, 251, 112, 244, 115, 251, 118, 249, 120, - 244, 122, - 244, 193, 241, 194, 241, 195, 241, 196, 241, 197, 241, 198, 241, 211, 254, - 212, - 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, 244, 227, 244, - 228, - 250, 229, 250, 230, 244, 233, 252, 234, 245, 235, 252, 236, 252, 238, 251, - 243, - 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, 249, 251, 249, - 252, - 249, 253, 249, 254, 244, 0, 1, 244, 0, 2, 241, 0, 3, 250, 0, 4, 241, 0, 5, - 244, 0, 6, - 241, 0, 7, 244, 0, 21, 245, 0, 25, 245, 0, 27, 245, 0, 29, 245, 0, 49, - 251, 0, 78, 254, - 0, 79, 244, 0, 82, 254, 0, 83, 244, 0, 87, 251, 0, 89, 251, 0, 91, 251, 0, - 109, 249, - 0, 113, 249, 0, 115, 249, 0, 117, 249, 73, 45, 245, 46, 242, 47, 245, 59, - 249, 60, - 248, 66, 241, 80, 254, 98, 244, 102, 245, 106, 251, 112, 244, 115, 251, - 118, 249, - 120, 244, 122, 244, 193, 241, 194, 241, 195, 241, 196, 241, 197, 241, 198, - 241, - 211, 254, 212, 254, 213, 254, 214, 254, 215, 254, 217, 254, 225, 250, 226, - 244, - 227, 244, 228, 250, 229, 250, 230, 244, 233, 245, 234, 245, 235, 252, 236, - 252, - 238, 251, 243, 244, 244, 244, 245, 244, 246, 244, 247, 244, 249, 244, 250, - 249, - 251, 249, 252, 249, 253, 249, 254, 244, 0, 1, 244, 0, 2, 241, 0, 3, 250, - 0, 4, 241, - 0, 5, 244, 0, 6, 241, 0, 7, 244, 0, 21, 252, 0, 25, 245, 0, 27, 245, 0, - 29, 245, 0, 49, - 251, 0, 78, 254, 0, 79, 244, 0, 82, 254, 0, 83, 244, 0, 87, 251, 0, 89, - 251, 0, 91, 251, - 0, 109, 249, 0, 113, 249, 0, 115, 249, 0, 117, 249, 11, 66, 250, 193, 250, - 194, 250, - 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, - 11, 66, 250, - 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, 198, 250, 0, 2, 250, 0, - 4, 250, - 0, 6, 250, 11, 66, 250, 193, 250, 194, 250, 195, 250, 196, 250, 197, 250, - 198, 250, - 0, 2, 250, 0, 4, 250, 0, 6, 250, 11, 66, 250, 193, 250, 194, 250, 195, - 250, 196, 250, - 197, 250, 198, 250, 0, 2, 250, 0, 4, 250, 0, 6, 250, 65, 45, 235, 46, 238, - 47, 235, - 59, 242, 60, 242, 66, 237, 80, 252, 98, 240, 102, 240, 106, 248, 112, 239, - 118, 238, - 193, 237, 194, 237, 195, 237, 196, 237, 197, 237, 198, 237, 211, 252, 212, - 252, - 213, 252, 214, 252, 215, 252, 217, 252, 225, 247, 226, 240, 227, 240, 228, - 240, - 229, 247, 230, 240, 233, 247, 234, 240, 235, 240, 236, 247, 238, 248, 243, - 245, - 244, 239, 245, 239, 246, 245, 247, 245, 249, 239, 250, 245, 251, 238, 252, - 238, - 253, 245, 0, 2, 237, 0, 3, 247, 0, 4, 237, 0, 5, 240, 0, 6, 237, 0, 7, - 240, 0, 21, 247, - 0, 25, 240, 0, 27, 240, 0, 29, 240, 0, 49, 248, 0, 78, 252, 0, 79, 245, 0, - 82, 252, 0, - 83, 239, 0, 109, 245, 0, 113, 238, 0, 115, 238, 0, 117, 238, 12, 66, 244, - 193, 244, - 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 0, 2, 244, 0, 4, 244, 0, - 6, 244, - 1, 32, 24, 245, 21, 33, 245, 101, 249, 109, 255, 115, 249, 116, 248, 117, - 254, 119, - 249, 0, 19, 249, 0, 60, 255, 0, 62, 255, 0, 68, 255, 0, 87, 249, 0, 89, - 249, 0, 91, 249, - 0, 93, 248, 0, 97, 248, 0, 99, 248, 0, 101, 254, 1, 2, 25, 248, 1, 32, 25, - 245, 11, 66, - 244, 193, 244, 194, 244, 195, 244, 196, 244, 197, 244, 198, 244, 0, 2, - 244, 0, 4, - 244, 0, 6, 244 -}; -static afm_cuint16 afm_Times_Roman_highchars_index[] = { /* 220 */ - 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 175, 176, - 177, - 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, - 193, - 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, - 209, - 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, - 225, - 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, - 241, - 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, - 257, - 258, 259, 260, 261, 262, 263, 268, 269, 270, 271, 272, 273, 274, 275, 278, - 279, - 280, 281, 282, 283, 286, 287, 290, 291, 298, 299, 302, 303, 304, 305, 310, - 311, - 313, 314, 315, 316, 317, 318, 321, 322, 323, 324, 325, 326, 327, 328, 332, - 333, - 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 350, 351, 352, - 353, - 354, 355, 356, 357, 362, 363, 366, 367, 368, 369, 370, 371, 376, 377, 378, - 379, - 380, 381, 382, 402, 536, 537, 710, 711, 728, 729, 730, 731, 732, 733, - 8211, 8212, - 8216, 8217, 8218, 8220, 8221, 8222, 8224, 8225, 8226, 8230, 8240, 8249, - 8250, - 8260, 8364, 8482, 8706, 8710, 8721, 8722, 8730, 8800, 8804, 8805, 9674, - 63171, - 64257, 64258 -}; -static afm_cunicode afm_Times_Roman_ligatures[] = { /* 3 */ - 102, 105, 64257 -}; -const afm_fontinfo afm_fontinfolist[] = { - { /* Courier.afm 761 bytes */ - "Courier", "Courier", - 629, -157, - afm_Courier_widths, - NULL, - NULL, - afm_Courier_highchars_index, 220, - afm_Courier_ligatures, 1}, - { /* Courier-Bold.afm 761 bytes */ - "Courier-Bold", "Courier Bold", - 629, -157, - afm_Courier_Bold_widths, - NULL, - NULL, - afm_Courier_Bold_highchars_index, 220, - afm_Courier_Bold_ligatures, 1}, - { /* Courier-BoldOblique.afm 761 bytes */ - "Courier-BoldOblique", "Courier Bold Oblique", - 629, -157, - afm_Courier_BoldOblique_widths, - NULL, - NULL, - afm_Courier_BoldOblique_highchars_index, 220, - afm_Courier_BoldOblique_ligatures, 1}, - { /* Courier-Oblique.afm 761 bytes */ - "Courier-Oblique", "Courier Oblique", - 629, -157, - afm_Courier_Oblique_widths, - NULL, - NULL, - afm_Courier_Oblique_highchars_index, 220, - afm_Courier_Oblique_ligatures, 1}, - { /* Helvetica.afm 7841 bytes */ - "Helvetica", "Helvetica", - 718, -207, - afm_Helvetica_widths, - afm_Helvetica_kerning_index, - afm_Helvetica_kerning_data, - afm_Helvetica_highchars_index, 220, - afm_Helvetica_ligatures, 1}, - { /* Helvetica-Bold.afm 7336 bytes */ - "Helvetica-Bold", "Helvetica Bold", - 718, -207, - afm_Helvetica_Bold_widths, - afm_Helvetica_Bold_kerning_index, - afm_Helvetica_Bold_kerning_data, - afm_Helvetica_Bold_highchars_index, 220, - afm_Helvetica_Bold_ligatures, 1}, - { /* Helvetica-BoldOblique.afm 7336 bytes */ - "Helvetica-BoldOblique", "Helvetica Bold Oblique", - 718, -207, - afm_Helvetica_BoldOblique_widths, - afm_Helvetica_BoldOblique_kerning_index, - afm_Helvetica_BoldOblique_kerning_data, - afm_Helvetica_BoldOblique_highchars_index, 220, - afm_Helvetica_BoldOblique_ligatures, 1}, - { /* Helvetica-Oblique.afm 7841 bytes */ - "Helvetica-Oblique", "Helvetica Oblique", - 718, -207, - afm_Helvetica_Oblique_widths, - afm_Helvetica_Oblique_kerning_index, - afm_Helvetica_Oblique_kerning_data, - afm_Helvetica_Oblique_highchars_index, 220, - afm_Helvetica_Oblique_ligatures, 1}, - { /* ZapfDingbats.afm 416 bytes */ - "ZapfDingbats", "ITC Zapf Dingbats", - 0, 0, - afm_ZapfDingbats_widths, - NULL, - NULL, - afm_ZapfDingbats_highchars_index, 107, - NULL, 0}, - { /* Symbol.afm 563 bytes */ - "Symbol", "Symbol", - 0, 0, - afm_Symbol_widths, - NULL, - NULL, - afm_Symbol_highchars_index, 156, - NULL, 0}, - { /* Times-Bold.afm 6761 bytes */ - "Times-Bold", "Times Bold", - 683, -217, - afm_Times_Bold_widths, - afm_Times_Bold_kerning_index, - afm_Times_Bold_kerning_data, - afm_Times_Bold_highchars_index, 220, - afm_Times_Bold_ligatures, 1}, - { /* Times-BoldItalic.afm 6270 bytes */ - "Times-BoldItalic", "Times Bold Italic", - 683, -217, - afm_Times_BoldItalic_widths, - afm_Times_BoldItalic_kerning_index, - afm_Times_BoldItalic_kerning_data, - afm_Times_BoldItalic_highchars_index, 220, - afm_Times_BoldItalic_ligatures, 1}, - { /* Times-Italic.afm 6975 bytes */ - "Times-Italic", "Times Italic", - 683, -217, - afm_Times_Italic_widths, - afm_Times_Italic_kerning_index, - afm_Times_Italic_kerning_data, - afm_Times_Italic_highchars_index, 220, - afm_Times_Italic_ligatures, 1}, - { /* Times-Roman.afm 6287 bytes */ - "Times-Roman", "Times Roman", - 683, -217, - afm_Times_Roman_widths, - afm_Times_Roman_kerning_index, - afm_Times_Roman_kerning_data, - afm_Times_Roman_highchars_index, 220, - afm_Times_Roman_ligatures, 1}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} -}; -const int afm_fontinfo_count = 14; diff --git a/program/src/rrd_afm_data.h b/program/src/rrd_afm_data.h deleted file mode 100644 index f2b9fa33..00000000 --- a/program/src/rrd_afm_data.h +++ /dev/null @@ -1,191 +0,0 @@ -/**************************************************************************** - * RRDtool 1.2.23 Copyright by Tobi Oetiker, 1997-2007 - **************************************************************************** - * rrd_afm_data.h Encoded afm (Adobe Font Metrics) for selected fonts. - ****************************************************************************/ - -#ifndef RRD_AFM_DATA_H -#define RRD_AFM_DATA_H - -/* -Description of data structures: - - Ideally, the struct should be a list of fonts, and each font - is a list of character-info. - Each character has a structure: - struct charinfo { - char16 thechar; - int width; - struct { - char16 nextchar; - int deltawidth; - } kernings[]; - struct { - char16 nextchar; - char16 resultingchar; - } ligatures[]; - } - - The data for typical fonts makes this a very sparse data structure. - For most fonts, only the letter "f" has ligatures. - All fonts have all (or almost all) of the characters 32-126, - most fonts have all 161-255, - and all fonts have very few 256-65535. - Most kerning pairs have both chars 32-126. - - The most basic design decisionÊis to have all this data as - const C globals all set up by array/struct initialisers - so runtime setup overhead is minimal. - The complete other possibility would be to parse and load - this info at runtime, but for rrdtool I have preferred - speed for flexibility as the same few fonts will be used - zillions of times. - - So the idea is to rewrite the above structure into - something which: - 1) uses/wastes minimal memory - 2) is fast for most characters - 3) supports at least Iso-Latin-1, prefer full unicode. - 4) doesn't need full precision in char width - (we can afford to loose 0.2% as rrdtool only needs to calculate - overall layout of elements, not positioning individual - characters) - 5) can be written as constant initialisers to C structs/arrays - so we don't have runtime overhead starting rrdtool. - 6) can be easily generated by some script so it is easy - to select a set of fonts and have the C data updated. - So adding/removing fonts is a matter of a recompile. - -Implementation design: - All character structs are sorted by unicode value. Info for - characters below 32 is discarded and the chars are treated - as a space. Missing characters in the 32-126 range are - substituted with default values so we can use direct array - access for those. For characters above 126, binary search - is used (not yet, liniar now but uses good guess for most latin 1 - characters). - - Ligature handling can be discarded as ligatures have very small - effects on string width. The width of the "fi" ligature - is the same (or very close) to the width of "f" plus the width - of "i". - If implemented, it can be a simple list (global for the font, - not for each character) because all fonts I've seen that have - ligatures has max 3 pairs: "fi", "fl", "ffl" and no other. - - Most characters has less than 10 kern pairs, few 10-20, and - extremly few 20-30. This is implemented as a simple - linear search with characters 256-65536 encoding using a prefix - so most kern pairs only take 2 bytes: - unsigned 8 bit char value and signed 8 bit kern width. - Using a non-packed format would enable binary search, but - would use almost twice as much memory for a yet unknown - gain in speed. - - Character widths are stored as unsigned bytes. Width of - one character is font-size * bytevalue * (1000 / 6) - AFM specifies widths as integers with 1000 representing 1 * font-size. - Kerning delta widths has same scaling factor, but the value - is a signed byte as many kerning widths are negative and smaller - than avarage character width. - - Kerning info is stored in a shared packed int8 array - to reduce the number of structs and memory usage. - This sets the maximum number of kerning pairs to - approx 15000. - The font I have seen with most kern pairs is - "Bodoni Old Face BE Bold Italic Oldstyle Figures" - which has 1718 pairs for 62 chars. - Typical fonts have 100-150 pairs. - For each character needs then only a 16 bit index - into this shared table. - The format of the sub-arrays are: - count ( unicode deltawidth ) - with the (...) repeated count times. - The count and the unicode is packed because a lot - entries is less than 256, and most below 400. - Therefore an escape sequence is used. - If the value is >= 510 - 1, high-8bits, low-8bits - else if the value is >= 254 - 0, value minus 254 - else - value plus 1 - An index of zero is treated as a NULL pointer, - and the first byte in a shared array is - therefore not used (and filled with a dummy value). - The array is only created if non-empty. - No entries can be zero (they are redundant), - and no subarray can be empty (as the index pointer - then is 0 meaning no sub array). - The deltawidth is stored as a non-escaped signed byte. - - So for each character needed info is: - width: unsigned 8 bit int. - kerning-subarray-index: unsigned 16 bit int. - - The first 126-32+1 entries are for the characters - 32-126. If any is missing, a dummy entry is created. - For characters 126-65535 a font-global - array of struct {unicode, char-index} is - used for binary search (not yet, liniar now). - - Ligatures can be implemented as a font-global - array of struct { - unicode char1, char2, resultingchar; - } - - Font-global info is stored in a struct afm_fontinfo (see below). - - The highchars_index and ligatures structures are flattened - to a simple array to avoid accidental padding between - structs if the structsize is problematic for some platforms. - - All fonts are stored in an array of this struct, - sorted by fullname for binary search (not yet sorted). - - The .afm files are compiled by a perl script which creates - rrd_afm_data.c - The only thing rrd_afm_data.c contains is this compiled data. - - Compiled on Mac OS X the size of rrd_afm_data.o - is 67 Kb for the standard 14 postscript fonts, - and 490 Kb for a set of 276 Adobe fonts. -*/ - -typedef unsigned char afm_uint8; -typedef signed char afm_sint8; -typedef unsigned short afm_uint16; -typedef signed short afm_sint16; -typedef unsigned short afm_unicode; - -typedef const afm_uint8 afm_cuint8; -typedef const afm_sint8 afm_csint8; -typedef const afm_uint16 afm_cuint16; -typedef const afm_sint16 afm_csint16; -typedef const afm_unicode afm_cunicode; - -typedef struct afm_fontinfo { - const char *fullname; /* e.g. "Futura Bold Oblique" */ - const char *postscript_name; /* e.g. "Futura-BoldOblique" */ - afm_cuint16 ascender, descender; - afm_cuint8 *widths; - afm_csint16 *kerning_index; - afm_cuint8 *kerning_data; - afm_cuint16 *highchars_index; - afm_cuint16 highchars_count; - afm_cunicode *ligatures; - afm_cuint16 ligatures_count; -} afm_fontinfo; - -typedef struct old_afm_fontinfo { - const char *fontname, *fullname; - const unsigned short *charinfo, *intarray; - const unsigned short charinfocount; - const unsigned short fixedpitch; -} old_afm_fontinfo; - -extern const afm_fontinfo afm_fontinfolist[]; -extern const int afm_fontinfo_count; - -#endif diff --git a/program/src/rrd_gfx.c b/program/src/rrd_gfx.c index 62088ddb..ec6a574b 100644 --- a/program/src/rrd_gfx.c +++ b/program/src/rrd_gfx.c @@ -16,110 +16,14 @@ # define RRDPRINTF(...) # endif /* DEBUG */ #endif /* _MSC_VER */ -#include "rrd_tool.h" -#include -#include -#include FT_FREETYPE_H -#include FT_GLYPH_H +#include "rrd_tool.h" #include "rrd_gfx.h" -#include "rrd_afm.h" -#include "unused.h" - -/* lines are better drawn on the pixle than between pixles */ -#define LINEOFFSET 0.5 - -#define USE_PDF_FAKE_ALPHA 1 -#define USE_EPS_FAKE_ALPHA 1 - -typedef struct gfx_char_s *gfx_char; -struct gfx_char_s { - FT_UInt index; /* glyph index */ - FT_Vector pos; /* location from baseline in 26.6 */ - FT_Glyph image; /* glyph bitmap */ -}; - -typedef struct gfx_string_s *gfx_string; -struct gfx_string_s { - unsigned int width; - unsigned int height; - int count; /* number of characters */ - gfx_char glyphs; - size_t num_glyphs; - FT_BBox bbox; - FT_Matrix transform; -}; - -/* compute string bbox */ -static void compute_string_bbox( - gfx_string string); - -/* create a freetype glyph string */ -gfx_string gfx_string_create( - gfx_canvas_t *canvas, - FT_Face face, - const char *text, - int rotation, - double tabwidth, - double size); - -/* create a freetype glyph string */ -static void gfx_string_destroy( - gfx_string string); - -static -gfx_node_t *gfx_new_node( - gfx_canvas_t *canvas, - enum gfx_en type) -{ - gfx_node_t *node = art_new(gfx_node_t, 1); - - if (node == NULL) - return NULL; - node->type = type; - node->color = 0x0; /* color of element 0xRRGGBBAA alpha 0xff is solid */ - node->size = 0.0; /* font size, line width */ - node->path = NULL; /* path */ - node->points = 0; - node->points_max = 0; - node->closed_path = 0; - node->filename = NULL; /* font or image filename */ - node->text = NULL; - node->x = 0.0; - node->y = 0.0; /* position */ - node->angle = 0; - node->halign = GFX_H_NULL; /* text alignement */ - node->valign = GFX_V_NULL; /* text alignement */ - node->tabwidth = 0.0; - node->next = NULL; - if (canvas->lastnode != NULL) { - canvas->lastnode->next = node; - } - if (canvas->firstnode == NULL) { - canvas->firstnode = node; - } - canvas->lastnode = node; - return node; -} - -gfx_canvas_t *gfx_new_canvas( - void) -{ - gfx_canvas_t *canvas = art_new(gfx_canvas_t, 1); - canvas->firstnode = NULL; - canvas->lastnode = NULL; - canvas->imgformat = IF_PNG; /* we default to PNG output */ - canvas->interlaced = 0; - canvas->zoom = 1.0; - canvas->font_aa_threshold = -1.0; - canvas->aa_type = AA_NORMAL; - return canvas; -} /* create a new line */ -gfx_node_t *gfx_new_line( - gfx_canvas_t *canvas, +void gfx_line( + cairo_t * cr, double X0, double Y0, double X1, @@ -127,11 +31,11 @@ gfx_node_t *gfx_new_line( double width, gfx_color_t color) { - return gfx_new_dashed_line(canvas, X0, Y0, X1, Y1, width, color, 0, 0); + gfx_dashed_line(cr, X0, Y0, X1, Y1, width, color, 0, 0); } -gfx_node_t *gfx_new_dashed_line( - gfx_canvas_t *canvas, +void gfx_dashed_line( + cairo_t * cr, double X0, double Y0, double X1, @@ -141,39 +45,29 @@ gfx_node_t *gfx_new_dashed_line( double dash_on, double dash_off) { - - gfx_node_t *node; - ArtVpath *vec; - - node = gfx_new_node(canvas, GFX_LINE); - if (node == NULL) - return NULL; - vec = art_new(ArtVpath, 3); - if (vec == NULL) - return NULL; - vec[0].code = ART_MOVETO_OPEN; - vec[0].x = X0 + LINEOFFSET; - vec[0].y = Y0 + LINEOFFSET; - vec[1].code = ART_LINETO; - vec[1].x = X1 + LINEOFFSET; - vec[1].y = Y1 + LINEOFFSET; - vec[2].code = ART_END; - vec[2].x = 0; - vec[2].y = 0; - - node->points = 3; - node->points_max = 3; - node->color = color; - node->size = width; - node->dash_on = dash_on; - node->dash_off = dash_off; - node->path = vec; - return node; + double dashes[] = { dash_on, dash_off }; + double x = 0; + double y = 0; + + cairo_save(cr); + cairo_new_path(cr); + cairo_set_line_width(cr, width); + gfx_line_fit(cr, &x, &y); + gfx_line_fit(cr, &X0, &Y0); + cairo_move_to(cr, X0, Y0); + gfx_line_fit(cr, &X1, &Y1); + cairo_line_to(cr, X1, Y1); + if (dash_on > 0 || dash_off > 0) + cairo_set_dash(cr, dashes, 2, x); + cairo_set_source_rgba(cr, color.red, color.green, color.blue, + color.alpha); + cairo_stroke(cr); + cairo_restore(cr); } /* create a new area */ -gfx_node_t *gfx_new_area( - gfx_canvas_t *canvas, +void gfx_new_area( + cairo_t * cr, double X0, double Y0, double X1, @@ -182,2712 +76,205 @@ gfx_node_t *gfx_new_area( double Y2, gfx_color_t color) { - - gfx_node_t *node; - ArtVpath *vec; - - node = gfx_new_node(canvas, GFX_AREA); - if (node == NULL) - return NULL; - vec = art_new(ArtVpath, 5); - if (vec == NULL) - return NULL; - vec[0].code = ART_MOVETO; - vec[0].x = X0; - vec[0].y = Y0; - vec[1].code = ART_LINETO; - vec[1].x = X1; - vec[1].y = Y1; - vec[2].code = ART_LINETO; - vec[2].x = X2; - vec[2].y = Y2; - vec[3].code = ART_LINETO; - vec[3].x = X0; - vec[3].y = Y0; - vec[4].code = ART_END; - vec[4].x = 0; - vec[4].y = 0; - - node->points = 5; - node->points_max = 5; - node->color = color; - node->path = vec; - - return node; + cairo_new_path(cr); + gfx_area_fit(cr, &X0, &Y0); + cairo_move_to(cr, X0, Y0); + gfx_area_fit(cr, &X1, &Y1); + cairo_line_to(cr, X1, Y1); + gfx_area_fit(cr, &X2, &Y2); + cairo_line_to(cr, X2, Y2); + cairo_set_source_rgba(cr, color.red, color.green, color.blue, + color.alpha); } /* add a point to a line or to an area */ -int gfx_add_point( - gfx_node_t *node, +void gfx_add_point( + cairo_t * cr, double x, double y) { - if (node == NULL) - return 1; - if (node->type == GFX_AREA) { - double X0 = node->path[0].x; - double Y0 = node->path[0].y; - - node->points -= 2; - art_vpath_add_point(&(node->path), - &(node->points), - &(node->points_max), ART_LINETO, x, y); - art_vpath_add_point(&(node->path), - &(node->points), - &(node->points_max), ART_LINETO, X0, Y0); - art_vpath_add_point(&(node->path), - &(node->points), - &(node->points_max), ART_END, 0, 0); - } else if (node->type == GFX_LINE) { - node->points -= 1; - art_vpath_add_point(&(node->path), - &(node->points), - &(node->points_max), - ART_LINETO, x + LINEOFFSET, y + LINEOFFSET); - art_vpath_add_point(&(node->path), - &(node->points), - &(node->points_max), ART_END, 0, 0); - - } else { - /* can only add point to areas and lines */ - return 1; - } - return 0; + gfx_area_fit(cr, &x, &y); + cairo_line_to(cr, x, y); } void gfx_close_path( - gfx_node_t *node) + cairo_t * cr) { - node->closed_path = 1; - if (node->path[0].code == ART_MOVETO_OPEN) - node->path[0].code = ART_MOVETO; + cairo_close_path(cr); + cairo_fill(cr); } /* create a text node */ -gfx_node_t *gfx_new_text( - gfx_canvas_t *canvas, +static PangoLayout *gfx_prep_text( + cairo_t * cr, double x, - double y, gfx_color_t color, char *font, double size, double tabwidth, - double angle, - enum gfx_h_align_en h_align, - enum gfx_v_align_en v_align, - char *text) + const char *text) { - gfx_node_t *node = gfx_new_node(canvas, GFX_TEXT); + PangoLayout *layout; + PangoFontDescription *font_desc; - node->text = strdup(text); - node->size = size; - node->filename = strdup(font); - node->x = x; - node->y = y; - node->angle = angle; - node->color = color; - node->tabwidth = tabwidth; - node->halign = h_align; - node->valign = v_align; -#if 0 - /* debugging: show text anchor - green is along x-axis, red is downward y-axis */ - if (1) { - double a = 2 * M_PI * -node->angle / 360.0; - double cos_a = cos(a); - double sin_a = sin(a); - double len = 3; + /* for performance reasons we might + want todo that only once ... tabs will always + be the same */ + long i; + long tab_count = strlen(text); + long tab_shift = fmod(x, tabwidth); - gfx_new_line(canvas, - x, y, x + len * cos_a, y - len * sin_a, 0.2, 0x00FF0000); - gfx_new_line(canvas, - x, y, x + len * sin_a, y + len * cos_a, 0.2, 0xFF000000); - } -#endif - return node; -} + PangoTabArray *tab_array; -int gfx_render( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fp) -{ - switch (canvas->imgformat) { - case IF_PNG: - return gfx_render_png(canvas, width, height, background, fp); - case IF_SVG: - return gfx_render_svg(canvas, width, height, background, fp); - case IF_EPS: - return gfx_render_eps(canvas, width, height, background, fp); - case IF_PDF: - return gfx_render_pdf(canvas, width, height, background, fp); - default: - return -1; + tab_array = pango_tab_array_new(tab_count, (gboolean) (1)); + for (i = 1; i <= tab_count; i++) { + pango_tab_array_set_tab(tab_array, + i, PANGO_TAB_LEFT, tabwidth * i - tab_shift); } -} - -static void gfx_string_destroy( - gfx_string string) -{ - unsigned int n; + cairo_new_path(cr); + cairo_set_source_rgba(cr, color.red, color.green, color.blue, + color.alpha); + layout = pango_cairo_create_layout(cr); - if (string->glyphs) { - for (n = 0; n < string->num_glyphs; ++n) - FT_Done_Glyph(string->glyphs[n].image); - free(string->glyphs); - } - free(string); + pango_layout_set_tabs(layout, tab_array); + font_desc = pango_font_description_from_string(font); + pango_font_description_set_size(font_desc, size * PANGO_SCALE); + pango_layout_set_font_description(layout, font_desc); + pango_layout_set_markup(layout, text, -1); + return layout; } - +/* Size Text Node */ double gfx_get_text_width( - gfx_canvas_t *canvas, + cairo_t * cr, double start, char *font, double size, double tabwidth, - char *text, - int rotation) + char *text) { - switch (canvas->imgformat) { - case IF_PNG: - return gfx_get_text_width_libart(canvas, start, font, size, tabwidth, - text, rotation); - case IF_SVG: /* fall through */ - case IF_EPS: - case IF_PDF: - return afm_get_text_width(start, font, size, tabwidth, text); - default: - return size * strlen(text); + PangoLayout *layout; + PangoRectangle log_rect; + gfx_color_t color = { 0, 0, 0, 0 }; + char *tab; + + /* turn \\t into tab */ + while (tab = strstr(text, "\\t")) { + memmove(tab + 1, tab + 2, strlen(tab + 2)); + tab[0] = (char) 9; } + layout = gfx_prep_text(cr, start, color, font, size, tabwidth, text); + pango_layout_get_pixel_extents(layout, NULL, &log_rect); + pango_tab_array_free(pango_layout_get_tabs(layout)); + g_object_unref(layout); + return log_rect.width; } -double gfx_get_text_width_libart( - gfx_canvas_t *canvas, - double UNUSED(start), +void gfx_text( + cairo_t * cr, + double x, + double y, + gfx_color_t color, char *font, double size, double tabwidth, - char *text, - int rotation) -{ - - int error; - double text_width = 0; - FT_Face face; - FT_Library library = NULL; - gfx_string string; - - FT_Init_FreeType(&library); - error = FT_New_Face(library, font, 0, &face); - if (error) { - FT_Done_FreeType(library); - return -1; - } - error = FT_Set_Char_Size(face, size * 64, size * 64, 100, 100); - if (error) { - FT_Done_FreeType(library); - return -1; - } - string = gfx_string_create(canvas, face, text, rotation, tabwidth, size); - text_width = string->width; - gfx_string_destroy(string); - FT_Done_FreeType(library); - return text_width / 64; -} - -static void gfx_libart_close_path( - gfx_node_t *node, - ArtVpath ** vec) -{ - /* libart must have end==start for closed paths, - even if using ART_MOVETO and not ART_MOVETO_OPEN - so add extra point which is the same as the starting point */ - int points_max = node->points; /* scaled array has exact size */ - int points = node->points - 1; - - art_vpath_add_point(vec, &points, &points_max, ART_LINETO, - (**vec).x, (**vec).y); - art_vpath_add_point(vec, &points, &points_max, ART_END, 0, 0); -} - - -/* find bbox of a string */ -static void compute_string_bbox( - gfx_string string) -{ - unsigned int n; - FT_BBox bbox; - - bbox.xMin = bbox.yMin = 32000; - bbox.xMax = bbox.yMax = -32000; - for (n = 0; n < string->num_glyphs; n++) { - FT_BBox glyph_bbox; - - FT_Glyph_Get_CBox(string->glyphs[n].image, ft_glyph_bbox_gridfit, - &glyph_bbox); - if (glyph_bbox.xMin < bbox.xMin) { - bbox.xMin = glyph_bbox.xMin; - } - if (glyph_bbox.yMin < bbox.yMin) { - bbox.yMin = glyph_bbox.yMin; - } - if (glyph_bbox.xMax > bbox.xMax) { - bbox.xMax = glyph_bbox.xMax; - } - if (glyph_bbox.yMax > bbox.yMax) { - bbox.yMax = glyph_bbox.yMax; - } - } - if (bbox.xMin > bbox.xMax) { - bbox.xMin = 0; - bbox.yMin = 0; - bbox.xMax = 0; - bbox.yMax = 0; - } - string->bbox.xMin = bbox.xMin; - string->bbox.xMax = bbox.xMax; - string->bbox.yMin = bbox.yMin; - string->bbox.yMax = bbox.yMax; -} - -/* create a free type glyph string */ -gfx_string gfx_string_create( - gfx_canvas_t *canvas, - FT_Face face, - const char *text, - int rotation, - double tabwidth, - double size) -{ - - FT_GlyphSlot slot = face->glyph; /* a small shortcut */ - FT_Bool use_kerning; - FT_UInt previous; - FT_Vector ft_pen; - - gfx_string string = (gfx_string) malloc(sizeof(struct gfx_string_s)); - - gfx_char glyph; /* current glyph in table */ - int n; - int error; - int gottab = 0; - -#ifdef HAVE_MBSTOWCS - wchar_t *cstr; - size_t clen = strlen(text) + 1; - - cstr = malloc(sizeof(wchar_t) * clen); /* yes we are allocating probably too much here, I know */ - string->count = mbstowcs(cstr, text, clen); - if (string->count == -1) { - /* conversion did not work, so lets fall back to just use what we got */ - string->count = clen - 1; - for (n = 0; text[n] != '\0'; n++) { - cstr[n] = (unsigned char) text[n]; - } - } -#else - char *cstr = strdup(text); - - string->count = strlen(text); -#endif - - ft_pen.x = 0; /* start at (0,0) !! */ - ft_pen.y = 0; - - - string->width = 0; - string->height = 0; - string->glyphs = - (gfx_char) calloc(string->count, sizeof(struct gfx_char_s)); - string->num_glyphs = 0; - string->transform.xx = - (FT_Fixed) (cos(M_PI * (rotation) / 180.0) * 0x10000); - string->transform.xy = - (FT_Fixed) (-sin(M_PI * (rotation) / 180.0) * 0x10000); - string->transform.yx = - (FT_Fixed) (sin(M_PI * (rotation) / 180.0) * 0x10000); - string->transform.yy = - (FT_Fixed) (cos(M_PI * (rotation) / 180.0) * 0x10000); - - use_kerning = FT_HAS_KERNING(face); - previous = 0; - glyph = string->glyphs; - for (n = 0; n < string->count; glyph++, n++) { - FT_Vector vec; - - /* handle the tabs ... - have a witespace glyph inserted, but set its width such that the distance - of the new right edge is x times tabwidth from 0,0 where x is an integer. */ - unsigned int letter = cstr[n]; - - letter = afm_fix_osx_charset(letter); /* unsafe macro */ - - gottab = 0; - if (letter == '\\' && n + 1 < string->count && cstr[n + 1] == 't') { - /* we have a tab here so skip the backslash and - set t to ' ' so that we get a white space */ - gottab = 1; - n++; - letter = ' '; - } - if (letter == '\t') { - letter = ' '; - gottab = 1; - } - /* initialize each struct gfx_char_s */ - glyph->index = 0; - glyph->pos.x = 0; - glyph->pos.y = 0; - glyph->image = NULL; - glyph->index = FT_Get_Char_Index(face, letter); - - /* compute glyph origin */ - if (use_kerning && previous && glyph->index) { - FT_Vector kerning; - - FT_Get_Kerning(face, previous, glyph->index, - ft_kerning_default, &kerning); - ft_pen.x += kerning.x; - ft_pen.y += kerning.y; - } - - /* load the glyph image (in its native format) */ - /* for now, we take a monochrome glyph bitmap */ - error = - FT_Load_Glyph(face, glyph->index, - size > - canvas->font_aa_threshold ? canvas->aa_type == - AA_NORMAL ? FT_LOAD_TARGET_NORMAL : canvas-> - aa_type == - AA_LIGHT ? FT_LOAD_TARGET_LIGHT : - FT_LOAD_TARGET_MONO : FT_LOAD_TARGET_MONO); - if (error) { - RRDPRINTF("couldn't load glyph: %c\n", letter) - continue; - } - error = FT_Get_Glyph(slot, &glyph->image); - if (error) { - RRDPRINTF("couldn't get glyph %c from slot %d\n", letter, - (int) slot) - continue; - } - /* if we are in tabbing mode, we replace the tab with a space and shift the position - of the space so that its left edge is where the tab was supposed to land us */ - if (gottab) { - /* we are in gridfitting mode so the calculations happen in 1/64 pixles */ - ft_pen.x = - tabwidth * 64.0 * (float) (1 + - (long) (ft_pen.x / - (tabwidth * 64.0))) - - slot->advance.x; - } - /* store current pen position */ - glyph->pos.x = ft_pen.x; - glyph->pos.y = ft_pen.y; - - - ft_pen.x += slot->advance.x; - ft_pen.y += slot->advance.y; - - /* rotate glyph */ - vec = glyph->pos; - FT_Vector_Transform(&vec, &string->transform); - error = FT_Glyph_Transform(glyph->image, &string->transform, &vec); - if (error) { - RRDPRINTF("couldn't transform glyph id %d\n", letter) - continue; - } - - /* convert to a bitmap - destroy native image */ - error = - FT_Glyph_To_Bitmap(&glyph->image, - size > - canvas->font_aa_threshold ? canvas->aa_type == - AA_NORMAL ? FT_RENDER_MODE_NORMAL : canvas-> - aa_type == - AA_LIGHT ? FT_RENDER_MODE_LIGHT : - FT_RENDER_MODE_MONO : FT_RENDER_MODE_MONO, 0, - 1); - if (error) { - RRDPRINTF("couldn't convert glyph id %d to bitmap\n", letter) - continue; - } - - /* increment number of glyphs */ - previous = glyph->index; - string->num_glyphs++; - } - free(cstr); -/* printf ("number of glyphs = %d\n", string->num_glyphs);*/ - compute_string_bbox(string); - /* the last character was a tab */ - /* if (gottab) { */ - string->width = ft_pen.x; - /* } else { - string->width = string->bbox.xMax - string->bbox.xMin; - } */ - string->height = string->bbox.yMax - string->bbox.yMin; - return string; -} - - -static int gfx_save_png( - art_u8 * buffer, - FILE * fp, - long width, - long height, - long bytes_per_pixel); - -/* render grafics into png image */ - -int gfx_render_png( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fp) -{ - - - FT_Library library; - gfx_node_t *node = canvas->firstnode; - - /* - art_u8 red = background >> 24, green = (background >> 16) & 0xff; - art_u8 blue = (background >> 8) & 0xff, alpha = ( background & 0xff ); - */ - unsigned long pys_width = width * canvas->zoom; - unsigned long pys_height = height * canvas->zoom; - const int bytes_per_pixel = 4; - unsigned long rowstride = pys_width * bytes_per_pixel; /* bytes per pixel */ - - /* fill that buffer with out background color */ - gfx_color_t *buffp = art_new(gfx_color_t, pys_width * pys_height); - art_u8 *buffer = (art_u8 *) buffp; - unsigned long i; - - for (i = 0; i < pys_width * pys_height; i++) { - *(buffp++) = background; - } - FT_Init_FreeType(&library); - while (node) { - switch (node->type) { - case GFX_LINE: - case GFX_AREA:{ - ArtVpath *vec; - double dst[6]; - ArtSVP *svp; - - art_affine_scale(dst, canvas->zoom, canvas->zoom); - vec = art_vpath_affine_transform(node->path, dst); - if (node->closed_path) - gfx_libart_close_path(node, &vec); - /* gfx_round_scaled_coordinates(vec); */ - /* pvec = art_vpath_perturb(vec); - art_free(vec); */ - if (node->type == GFX_LINE) { - svp = art_svp_vpath_stroke(vec, ART_PATH_STROKE_JOIN_ROUND, - ART_PATH_STROKE_CAP_ROUND, - node->size * canvas->zoom, 4, - 0.25); - } else { - svp = art_svp_from_vpath(vec); - /* this takes time and is unnecessary since we make - sure elsewhere that the areas are going clock-whise */ - /* svpt = art_svp_uncross( svp ); - art_svp_free(svp); - svp = art_svp_rewind_uncrossed(svpt,ART_WIND_RULE_NONZERO); - art_svp_free(svpt); - */ - } - art_free(vec); - /* this is from gnome since libart does not have this yet */ - gnome_print_art_rgba_svp_alpha(svp, 0, 0, pys_width, pys_height, - node->color, buffer, rowstride, - NULL); - art_svp_free(svp); - break; - } - case GFX_TEXT:{ - unsigned int n; - int error; - art_u8 fcolor[4], falpha; - FT_Face face; - gfx_char glyph; - gfx_string string; - FT_Vector vec; /* 26.6 */ - - float pen_x = 0.0, pen_y = 0.0; - - /* double x,y; */ - long ix, iy; - - fcolor[0] = node->color >> 24; - fcolor[1] = (node->color >> 16) & 0xff; - fcolor[2] = (node->color >> 8) & 0xff; - falpha = node->color & 0xff; - error = FT_New_Face(library, (char *) node->filename, 0, &face); - if (error) { - rrd_set_error("failed to load %s", node->filename); - - break; - } - error = FT_Set_Char_Size(face, /* handle to face object */ - (long) (node->size * 64), - (long) (node->size * 64), - (long) (100 * canvas->zoom), - (long) (100 * canvas->zoom)); - if (error) { - FT_Done_Face(face); - break; - } - pen_x = node->x * canvas->zoom; - pen_y = node->y * canvas->zoom; - - string = - gfx_string_create(canvas, face, node->text, node->angle, - node->tabwidth, node->size); - FT_Done_Face(face); - - switch (node->halign) { - case GFX_H_RIGHT: - vec.x = -string->bbox.xMax; - break; - case GFX_H_CENTER: - vec.x = abs(string->bbox.xMax) >= abs(string->bbox.xMin) ? - -string->bbox.xMax / 2 : -string->bbox.xMin / 2; - break; - case GFX_H_LEFT: - vec.x = -string->bbox.xMin; - break; - case GFX_H_NULL: - vec.x = 0; - break; - } - - switch (node->valign) { - case GFX_V_TOP: - vec.y = string->bbox.yMax; - break; - case GFX_V_CENTER: - vec.y = abs(string->bbox.yMax) >= abs(string->bbox.yMin) ? - string->bbox.yMax / 2 : string->bbox.yMin / 2; - break; - case GFX_V_BOTTOM: - vec.y = 0; - break; - case GFX_V_NULL: - vec.y = 0; - break; - } - pen_x += vec.x / 64; - pen_y += vec.y / 64; - glyph = string->glyphs; - for (n = 0; n < string->num_glyphs; n++, glyph++) { - int gr; - FT_Glyph image; - FT_BitmapGlyph bit; - - /* long buf_x,comp_n; */ - /* make copy to transform */ - if (!glyph->image) { - RRDPRINTF("no image\n") - continue; - } - error = FT_Glyph_Copy(glyph->image, &image); - if (error) { - RRDPRINTF("couldn't copy image\n") - continue; - } - - /* transform it */ - vec = glyph->pos; - FT_Vector_Transform(&vec, &string->transform); - - bit = (FT_BitmapGlyph) image; - gr = bit->bitmap.num_grays - 1; -/* - buf_x = (pen_x + 0.5) + (double)bit->left; - comp_n = buf_x + bit->bitmap.width > pys_width ? pys_width - buf_x : bit->bitmap.width; - if (buf_x < 0 || buf_x >= (long)pys_width) continue; - buf_x *= bytes_per_pixel ; - for (iy=0; iy < bit->bitmap.rows; iy++){ - long buf_y = iy+(pen_y+0.5)-(double)bit->top; - if (buf_y < 0 || buf_y >= (long)pys_height) continue; - buf_y *= rowstride; - for (ix=0;ix < bit->bitmap.width;ix++){ - *(letter + (ix*bytes_per_pixel+3)) = *(bit->bitmap.buffer + iy * bit->bitmap.width + ix); - } - art_rgba_rgba_composite(buffer + buf_y + buf_x ,letter,comp_n); - } - art_free(letter); -*/ - switch (bit->bitmap.pixel_mode) { - case FT_PIXEL_MODE_GRAY: - for (iy = 0; iy < bit->bitmap.rows; iy++) { - long buf_y = iy + (pen_y + 0.5) - bit->top; - - if (buf_y < 0 || buf_y >= (long) pys_height) - continue; - buf_y *= rowstride; - for (ix = 0; ix < bit->bitmap.width; ix++) { - long buf_x = - ix + (pen_x + 0.5) + (double) bit->left; - art_u8 font_alpha; - - if (buf_x < 0 || buf_x >= (long) pys_width) - continue; - buf_x *= bytes_per_pixel; - font_alpha = - *(bit->bitmap.buffer + - iy * bit->bitmap.pitch + ix); - if (font_alpha > 0) { - fcolor[3] = - (art_u8) ((double) font_alpha / gr * - falpha); - art_rgba_rgba_composite(buffer + buf_y + - buf_x, fcolor, 1); - } - } - } - break; - - case FT_PIXEL_MODE_MONO: - for (iy = 0; iy < bit->bitmap.rows; iy++) { - long buf_y = iy + (pen_y + 0.5) - bit->top; - - if (buf_y < 0 || buf_y >= (long) pys_height) - continue; - buf_y *= rowstride; - for (ix = 0; ix < bit->bitmap.width; ix++) { - long buf_x = - ix + (pen_x + 0.5) + (double) bit->left; - - if (buf_x < 0 || buf_x >= (long) pys_width) - continue; - buf_x *= bytes_per_pixel; - if ((fcolor[3] = - falpha * - ((* - (bit->bitmap.buffer + - iy * bit->bitmap.pitch + ix / 8) >> (7 - - (ix % - 8))) - & 1)) > 0) - art_rgba_rgba_composite(buffer + buf_y + - buf_x, fcolor, 1); - } - } - break; - - default: - rrd_set_error("unknown freetype pixel mode: %d", - bit->bitmap.pixel_mode); - break; - } - -/* - for (iy=0; iy < bit->bitmap.rows; iy++){ - long buf_y = iy+(pen_y+0.5)-bit->top; - if (buf_y < 0 || buf_y >= (long)pys_height) continue; - buf_y *= rowstride; - for (ix=0;ix < bit->bitmap.width;ix++){ - long buf_x = ix + (pen_x + 0.5) + (double)bit->left ; - art_u8 font_alpha; - - if (buf_x < 0 || buf_x >= (long)pys_width) continue; - buf_x *= bytes_per_pixel ; - font_alpha = *(bit->bitmap.buffer + iy * bit->bitmap.width + ix); - font_alpha = (art_u8)((double)font_alpha / gr * falpha); - for (iz = 0; iz < 3; iz++){ - art_u8 *orig = buffer + buf_y + buf_x + iz; - *orig = (art_u8)((double)*orig / gr * ( gr - font_alpha) + - (double)fcolor[iz] / gr * (font_alpha)); - } - } - } -*/ - FT_Done_Glyph(image); - } - gfx_string_destroy(string); - } - } - node = node->next; - } - gfx_save_png(buffer, fp, pys_width, pys_height, bytes_per_pixel); - art_free(buffer); - FT_Done_FreeType(library); - return 0; -} - -/* free memory used by nodes this will also remove memory required for - associated paths and svcs ... but not for text strings */ -int gfx_destroy( - gfx_canvas_t *canvas) -{ - gfx_node_t *next, *node = canvas->firstnode; - - while (node) { - next = node->next; - art_free(node->path); - free(node->text); - free(node->filename); - art_free(node); - node = next; - } - art_free(canvas); - return 0; -} - -static int gfx_save_png( - art_u8 * buffer, - FILE * fp, - long width, - long height, - long bytes_per_pixel) -{ - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; - int i; - png_bytep *row_pointers; - int rowstride = width * bytes_per_pixel; - png_text text[2]; - - if (fp == NULL) - return (1); - - png_ptr = - png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (png_ptr == NULL) { - return (1); - } - row_pointers = (png_bytepp) png_malloc(png_ptr, - height * sizeof(png_bytep)); - - info_ptr = png_create_info_struct(png_ptr); - - if (info_ptr == NULL) { - png_free(png_ptr, row_pointers); - png_destroy_write_struct(&png_ptr, (png_infopp) NULL); - return (1); - } - - if (setjmp(png_jmpbuf(png_ptr))) { - /* If we get here, we had a problem writing the file */ - png_destroy_write_struct(&png_ptr, &info_ptr); - return (1); - } - - png_init_io(png_ptr, fp); - png_set_IHDR(png_ptr, info_ptr, width, height, - 8, PNG_COLOR_TYPE_RGB_ALPHA, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - - text[0].key = "Software"; - text[0].text = - "RRDtool, Tobias Oetiker , http://tobi.oetiker.ch"; - text[0].compression = PNG_TEXT_COMPRESSION_NONE; - png_set_text(png_ptr, info_ptr, text, 1); - - /* lets make this fast while ending up with some increass in image size */ - png_set_filter(png_ptr, 0, PNG_FILTER_NONE); - /* png_set_filter(png_ptr,0,PNG_FILTER_SUB); */ - png_set_compression_level(png_ptr, 1); - /* png_set_compression_strategy(png_ptr,Z_HUFFMAN_ONLY); */ - /* - png_set_filter(png_ptr,PNG_FILTER_TYPE_BASE,PNG_FILTER_SUB); - png_set_compression_strategy(png_ptr,Z_HUFFMAN_ONLY); - png_set_compression_level(png_ptr,Z_BEST_SPEED); */ - - /* Write header data */ - png_write_info(png_ptr, info_ptr); - for (i = 0; i < height; i++) - row_pointers[i] = (png_bytep) (buffer + i * rowstride); - - png_write_image(png_ptr, row_pointers); - png_write_end(png_ptr, info_ptr); - png_free(png_ptr, row_pointers); - png_destroy_write_struct(&png_ptr, &info_ptr); - return 1; -} - - -/* ----- COMMON ROUTINES for pdf, svg and eps */ -#define min3(a, b, c) (a < b ? (a < c ? a : c) : (b < c ? b : c)) -#define max3(a, b, c) (a > b ? (a > c ? a : c) : (b > c ? b : c)) - -#define PDF_CALC_DEBUG 0 - -typedef struct pdf_point { - double x, y; -} pdf_point; - -typedef struct { - double ascender, descender, baselineY; - pdf_point sizep, minp, maxp; - double x, y, tdx, tdy; - double r, cos_r, sin_r; - double ma, mb, mc, md, mx, my; /* pdf coord matrix */ - double tmx, tmy; /* last 2 coords of text coord matrix */ -#if PDF_CALC_DEBUG - int debug; -#endif -} pdf_coords; - -#if PDF_CALC_DEBUG -static void pdf_dump_calc( - gfx_node_t *node, - pdf_coords * g) -{ - fprintf(stderr, "PDF CALC =============================\n"); - fprintf(stderr, " '%s' at %f pt\n", node->text, node->size); - fprintf(stderr, " align h = %s, v = %s, sizep = %f, %f\n", - (node->halign == GFX_H_RIGHT ? "r" : - (node->halign == GFX_H_CENTER ? "c" : - (node->halign == GFX_H_LEFT ? "l" : "N"))), - (node->valign == GFX_V_TOP ? "t" : - (node->valign == GFX_V_CENTER ? "c" : - (node->valign == GFX_V_BOTTOM ? "b" : "N"))), - g->sizep.x, g->sizep.y); - fprintf(stderr, " r = %f = %f, cos = %f, sin = %f\n", - g->r, node->angle, g->cos_r, g->sin_r); - fprintf(stderr, " ascender = %f, descender = %f, baselineY = %f\n", - g->ascender, g->descender, g->baselineY); - fprintf(stderr, " sizep: %f, %f\n", g->sizep.x, g->sizep.y); - fprintf(stderr, " minp: %f, %f maxp = %f, %f\n", - g->minp.x, g->minp.y, g->maxp.x, g->maxp.y); - fprintf(stderr, " x = %f, y = %f\n", g->x, g->y); - fprintf(stderr, " tdx = %f, tdy = %f\n", g->tdx, g->tdy); - fprintf(stderr, " GM = %f, %f, %f, %f, %f, %f\n", - g->ma, g->mb, g->mc, g->md, g->mx, g->my); - fprintf(stderr, " TM = %f, %f, %f, %f, %f, %f\n", - g->ma, g->mb, g->mc, g->md, g->tmx, g->tmy); -} -#endif - -#if PDF_CALC_DEBUG -#define PDF_DD(x) if (g->debug) x; -#else -#define PDF_DD(x) -#endif - -static void pdf_rotate( - pdf_coords * g, - pdf_point *p) -{ - double x2 = g->cos_r * p->x - g->sin_r * p->y; - double y2 = g->sin_r * p->x + g->cos_r * p->y; - - PDF_DD(fprintf - (stderr, " rotate(%f, %f) -> %f, %f\n", p->x, p->y, x2, y2)) - p->x = x2; - p->y = y2; -} - - -static void pdf_calc( - int page_height, - gfx_node_t *node, - pdf_coords * g) + double angle, + enum gfx_h_align_en h_align, + enum gfx_v_align_en v_align, + const char *text) { - pdf_point a, b, c; - -#if PDF_CALC_DEBUG - /* g->debug = !!strstr(node->text, "RevProxy-1") || !!strstr(node->text, "08:00"); */ - g->debug = !!strstr(node->text, "sekunder") - || !!strstr(node->text, "Web"); -#endif - g->x = node->x; - g->y = page_height - node->y; - if (node->angle) { - g->r = 2 * M_PI * node->angle / 360.0; - g->cos_r = cos(g->r); - g->sin_r = sin(g->r); - } else { - g->r = 0; - g->cos_r = 1; - g->sin_r = 0; - } - g->ascender = afm_get_ascender(node->filename, node->size); - g->descender = afm_get_descender(node->filename, node->size); - g->sizep.x = - afm_get_text_width(0, node->filename, node->size, node->tabwidth, - node->text); - /* seems like libart ignores the descender when doing vertial-align = bottom, - so we do that too, to get labels v-aligning properly */ - g->sizep.y = -g->ascender; /* + afm_get_descender(font->ps_font, node->size); */ - g->baselineY = -g->ascender - g->sizep.y / 2; - a.x = g->sizep.x; - a.y = g->sizep.y; - b.x = g->sizep.x; - b.y = 0; - c.x = 0; - c.y = g->sizep.y; - if (node->angle) { - pdf_rotate(g, &a); - pdf_rotate(g, &b); - pdf_rotate(g, &c); - } - g->minp.x = min3(a.x, b.x, c.x); - g->minp.y = min3(a.y, b.y, c.y); - g->maxp.x = max3(a.x, b.x, c.x); - g->maxp.y = max3(a.y, b.y, c.y); - /* The alignment parameters in node->valign and node->halign - specifies the alignment in the non-rotated coordinate system - (very unlike pdf/postscript), which complicates matters. - */ - switch (node->halign) { + PangoLayout *layout; + PangoRectangle log_rect; + PangoRectangle ink_rect; + double sx = 0; + double sy = 0; + + cairo_save(cr); + cairo_translate(cr, x, y); +/* gfx_line(cr,-2,0,2,0,1,color); + gfx_line(cr,0,-2,0,2,1,color); */ + layout = gfx_prep_text(cr, x, color, font, size, tabwidth, text); + pango_layout_get_pixel_extents(layout, &ink_rect, &log_rect); + cairo_rotate(cr, -angle * G_PI / 180.0); + sx = log_rect.x; + sy = ink_rect.y; + switch (h_align) { case GFX_H_RIGHT: - g->tdx = -g->maxp.x; + sx -= log_rect.width; break; case GFX_H_CENTER: - g->tdx = -(g->maxp.x + g->minp.x) / 2; + sx -= log_rect.width / 2; break; case GFX_H_LEFT: - g->tdx = -g->minp.x; break; case GFX_H_NULL: - g->tdx = 0; break; } - switch (node->valign) { + sy += log_rect.y; + switch (v_align) { case GFX_V_TOP: - g->tdy = -g->maxp.y; break; case GFX_V_CENTER: - g->tdy = -(g->maxp.y + g->minp.y) / 2; + sy -= log_rect.height / 2; break; case GFX_V_BOTTOM: - g->tdy = -g->minp.y; + sy -= log_rect.height; break; case GFX_V_NULL: - g->tdy = 0; break; } - g->ma = g->cos_r; - g->mb = g->sin_r; - g->mc = -g->sin_r; - g->md = g->cos_r; - g->mx = g->x + g->tdx; - g->my = g->y + g->tdy; - g->tmx = g->mx - g->ascender * g->mc; - g->tmy = g->my - g->ascender * g->md; - PDF_DD(pdf_dump_calc(node, g)) -} - -/* ------- SVG ------- - SVG reference: - http://www.w3.org/TR/SVG/ -*/ -static int svg_indent = 0; -static int svg_single_line = 0; -static const char *svg_default_font = "-dummy-"; -typedef struct svg_dash { - int dash_enable; - double dash_adjust, dash_len, dash_offset; - double adjusted_on, adjusted_off; -} svg_dash; + pango_cairo_update_layout(cr, layout); + cairo_move_to(cr, sx, sy); + pango_cairo_show_layout(cr, layout); + pango_tab_array_free(pango_layout_get_tabs(layout)); + g_object_unref(layout); + cairo_restore(cr); - -static void svg_print_indent( - FILE * fp) -{ - int i; - - for (i = svg_indent - svg_single_line; i > 0; i--) { - putc(' ', fp); - putc(' ', fp); - } } -static void svg_start_tag( - FILE * fp, - const char *name) +/* convert color */ +struct gfx_color_t gfx_hex_to_col( + long unsigned int color) { - svg_print_indent(fp); - putc('<', fp); - fputs(name, fp); - svg_indent++; -} + struct gfx_color_t gfx_color; -static void svg_close_tag_single_line( - FILE * fp) -{ - svg_single_line++; - putc('>', fp); + gfx_color.red = 1.0 / 255.0 * ((color & 0xff000000) >> (3 * 8)); + gfx_color.green = 1.0 / 255.0 * ((color & 0x00ff0000) >> (2 * 8)); + gfx_color.blue = 1.0 / 255.0 * ((color & 0x0000ff00) >> (1 * 8)); + gfx_color.alpha = 1.0 / 255.0 * (color & 0x000000ff); + return gfx_color; } -static void svg_close_tag( - FILE * fp) -{ - putc('>', fp); - if (!svg_single_line) - putc('\n', fp); -} +/* gridfit_lines */ -static void svg_end_tag( - FILE * fp, - const char *name) +void gfx_line_fit( + cairo_t * cr, + double *x, + double *y) { - /* name is NULL if closing empty-node tag */ - svg_indent--; - if (svg_single_line) - svg_single_line--; - else if (name) - svg_print_indent(fp); - if (name != NULL) { - fputs("': - fputs(">", fp); - break; - case '"': - fputs(""", fp); - break; - default: - if (ch == 32) { -#ifdef HAVE_MBSTOWCS - if (p <= cstr + 1 || !*p || *p == 32) - fputs(" ", fp); /* non-breaking space in unicode */ - else -#endif - fputc(32, fp); - } else if (ch < 32 || ch >= 127) - fprintf(fp, "&#%d;", (int) ch); - else - putc((char) ch, fp); - } - } -} - -static void svg_format_number( - char *buf, - int bufsize, - double d) -{ - /* omit decimals if integer to reduce filesize */ - char *p; - - snprintf(buf, bufsize, "%.2f", d); - p = buf; /* doesn't trust snprintf return value */ - while (*p) - p++; - while (--p > buf) { - char ch = *p; - - if (ch == '0') { - *p = '\0'; /* zap trailing zeros */ - continue; - } - if (ch == '.') - *p = '\0'; /* zap trailing dot */ - break; - } -} - -static void svg_write_number( - FILE * fp, - double d) -{ - char buf[60]; - - svg_format_number(buf, sizeof(buf), d); - fputs(buf, fp); -} - -static int svg_color_is_black( - int c) -{ - /* gfx_color_t is RRGGBBAA */ - return c == 0x000000FF; -} - -static void svg_write_color( - FILE * fp, - gfx_color_t c, - const char *attr) -{ - /* gfx_color_t is RRGGBBAA, svg can use #RRGGBB and #RGB like html */ - gfx_color_t rrggbb = (int) ((c >> 8) & 0xFFFFFF); - gfx_color_t opacity = c & 0xFF; - - fprintf(fp, " %s=\"", attr); - if ((rrggbb & 0x0F0F0F) == ((rrggbb >> 4) & 0x0F0F0F)) { - /* css2 short form, #rgb is #rrggbb, not #r0g0b0 */ - fprintf(fp, "#%03lX", (((rrggbb >> 8) & 0xF00) - | ((rrggbb >> 4) & 0x0F0) - | (rrggbb & 0x00F))); - } else { - fprintf(fp, "#%06lX", rrggbb); - } - fputs("\"", fp); - if (opacity != 0xFF) { - fprintf(fp, " opacity=\""); - svg_write_number(fp, opacity / 255.0); - fputs("\"", fp); - } -} - -static void svg_get_dash( - gfx_node_t *node, - svg_dash *d) -{ - double offset; - int mult; - - if (node->dash_on <= 0 || node->dash_off <= 0) { - d->dash_enable = 0; - return; - } - d->dash_enable = 1; - d->dash_len = node->dash_on + node->dash_off; - /* dash on/off adjustment due to round caps */ - d->dash_adjust = 0.8 * node->size; - d->adjusted_on = node->dash_on - d->dash_adjust; - if (d->adjusted_on < 0.01) - d->adjusted_on = 0.01; - d->adjusted_off = d->dash_len - d->adjusted_on; - /* dash offset calc */ - if (node->path[0].x == node->path[1].x) /* only good for horz/vert lines */ - offset = node->path[0].y; - else - offset = node->path[0].x; - mult = (int) fabs(offset / d->dash_len); - d->dash_offset = offset - mult * d->dash_len; - if (node->path[0].x < node->path[1].x - || node->path[0].y < node->path[1].y) - d->dash_offset = d->dash_len - d->dash_offset; -} - -static int svg_dash_equal( - svg_dash *a, - svg_dash *b) -{ - if (a->dash_enable != b->dash_enable) - return 0; - if (a->adjusted_on != b->adjusted_on) - return 0; - if (a->adjusted_off != b->adjusted_off) - return 0; - /* rest of properties will be the same when on+off are */ - return 1; -} - -static void svg_common_path_attributes( - FILE * fp, - gfx_node_t *node) -{ - svg_dash dash_info; - - svg_get_dash(node, &dash_info); - fputs(" stroke-width=\"", fp); - svg_write_number(fp, node->size); - fputs("\"", fp); - svg_write_color(fp, node->color, "stroke"); - fputs(" fill=\"none\"", fp); - if (dash_info.dash_enable) { - if (dash_info.dash_offset != 0) { - fputs(" stroke-dashoffset=\"", fp); - svg_write_number(fp, dash_info.dash_offset); - fputs("\"", fp); - } - fputs(" stroke-dasharray=\"", fp); - svg_write_number(fp, dash_info.adjusted_on); - fputs(",", fp); - svg_write_number(fp, dash_info.adjusted_off); - fputs("\"", fp); - } -} - -static int svg_is_int_step( - double a, - double b) -{ - double diff = fabs(a - b); - - return floor(diff) == diff; -} - -static int svg_path_straight_segment( - FILE * fp, - double lastA, - double currentA, - double currentB, - gfx_node_t *node, - int segment_idx, - int isx, - char absChar, - char relChar) -{ - if (!svg_is_int_step(lastA, currentA)) { - putc(absChar, fp); - svg_write_number(fp, currentA); - return 0; - } - if (segment_idx < node->points - 1) { - ArtVpath *vec = node->path + segment_idx + 1; - - if (vec->code == ART_LINETO) { - double nextA = (isx ? vec->x : vec->y) - LINEOFFSET; - double nextB = (isx ? vec->y : vec->x) - LINEOFFSET; - - if (nextB == currentB - && ((currentA >= lastA) == (nextA >= currentA)) - && svg_is_int_step(currentA, nextA)) { - return 1; /* skip to next as it is a straight line */ - } - } - } - putc(relChar, fp); - svg_write_number(fp, currentA - lastA); - return 0; -} - -static void svg_path( - FILE * fp, - gfx_node_t *node, - int multi) -{ - int i; - double lastX = 0, lastY = 0; - - /* for straight lines tags take less space than - tags because of the efficient packing - in the 'd' attribute */ - svg_start_tag(fp, "path"); - if (!multi) - svg_common_path_attributes(fp, node); - fputs(" d=\"", fp); - /* specification of the 'd' attribute: */ - /* http://www.w3.org/TR/SVG/paths.html#PathDataGeneralInformation */ - for (i = 0; i < node->points; i++) { - ArtVpath *vec = node->path + i; - double x = vec->x - LINEOFFSET; - double y = vec->y - LINEOFFSET; - - switch (vec->code) { - case ART_MOVETO_OPEN: /* fall-through */ - case ART_MOVETO: - putc('M', fp); - svg_write_number(fp, x); - putc(',', fp); - svg_write_number(fp, y); - break; - case ART_LINETO: - /* try optimize filesize by using minimal lineto commands */ - /* without introducing rounding errors. */ - if (x == lastX) { - if (svg_path_straight_segment - (fp, lastY, y, x, node, i, 0, 'V', 'v')) - continue; - } else if (y == lastY) { - if (svg_path_straight_segment - (fp, lastX, x, y, node, i, 1, 'H', 'h')) - continue; - } else { - putc('L', fp); - svg_write_number(fp, x); - putc(',', fp); - svg_write_number(fp, y); - } - break; - case ART_CURVETO: - break; /* unsupported */ - case ART_END: - break; /* nop */ - } - lastX = x; - lastY = y; - } - if (node->closed_path) - fputs(" Z", fp); - fputs("\"", fp); - svg_close_tag_empty_node(fp); -} - -static void svg_multi_path( - FILE * fp, - gfx_node_t **nodeR) -{ - /* optimize for multiple paths with the same color, penwidth, etc. */ - int num = 1; - gfx_node_t *node = *nodeR; - gfx_node_t *next = node->next; - - while (next) { - if (next->type != node->type - || next->size != node->size - || next->color != node->color - || next->dash_on != node->dash_on - || next->dash_off != node->dash_off) - break; - next = next->next; - num++; - } - if (num == 1) { - svg_path(fp, node, 0); - return; - } - svg_start_tag(fp, "g"); - svg_common_path_attributes(fp, node); - svg_close_tag(fp); - while (num && node) { - svg_path(fp, node, 1); - if (!--num) - break; - node = node->next; - *nodeR = node; - } - svg_end_tag(fp, "g"); -} - -static void svg_area( - FILE * fp, - gfx_node_t *node) -{ - int i; - double startX = 0, startY = 0; - - svg_start_tag(fp, "polygon"); - fputs(" ", fp); - svg_write_color(fp, node->color, "fill"); - fputs(" points=\"", fp); - for (i = 0; i < node->points; i++) { - ArtVpath *vec = node->path + i; - double x = vec->x - LINEOFFSET; - double y = vec->y - LINEOFFSET; - - switch (vec->code) { - case ART_MOVETO_OPEN: /* fall-through */ - case ART_MOVETO: - svg_write_number(fp, x); - putc(',', fp); - svg_write_number(fp, y); - startX = x; - startY = y; - break; - case ART_LINETO: - if (i == node->points - 2 - && node->path[i + 1].code == ART_END - && fabs(x - startX) < 0.001 && fabs(y - startY) < 0.001) { - break; /* poly area always closed, no need for last point */ - } - putc(' ', fp); - svg_write_number(fp, x); - putc(',', fp); - svg_write_number(fp, y); - break; - case ART_CURVETO: - break; /* unsupported */ - case ART_END: - break; /* nop */ - } - } - fputs("\"", fp); - svg_close_tag_empty_node(fp); -} - -static void svg_text( - FILE * fp, - gfx_node_t *node) -{ - pdf_coords g; - const char *fontname; - - /* as svg has 0,0 in top-left corner (like most screens) instead of - bottom-left corner like pdf and eps, we have to fake the coords - using offset and inverse sin(r) value */ - int page_height = 1000; - - pdf_calc(page_height, node, &g); - if (node->angle != 0) { - svg_start_tag(fp, "g"); - /* can't use svg_write_number as 2 decimals is far from enough to avoid - skewed text */ - fprintf(fp, " transform=\"matrix(%f,%f,%f,%f,%f,%f)\"", - g.ma, -g.mb, -g.mc, g.md, g.tmx, page_height - g.tmy); - svg_close_tag(fp); - } - svg_start_tag(fp, "text"); - if (!node->angle) { - fputs(" x=\"", fp); - svg_write_number(fp, g.tmx); - fputs("\" y=\"", fp); - svg_write_number(fp, page_height - g.tmy); - fputs("\"", fp); - } - fontname = afm_get_font_name(node->filename); - if (strcmp(fontname, svg_default_font)) - fprintf(fp, " font-family=\"%s\"", fontname); - fputs(" font-size=\"", fp); - svg_write_number(fp, node->size); - fputs("\"", fp); - if (!svg_color_is_black(node->color)) - svg_write_color(fp, node->color, "fill"); - svg_close_tag_single_line(fp); - /* support for node->tabwidth missing */ - svg_write_text(fp, node->text); - svg_end_tag(fp, "text"); - if (node->angle != 0) - svg_end_tag(fp, "g"); -} - -int gfx_render_svg( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fp) -{ - gfx_node_t *node = canvas->firstnode; - - /* Find the first font used, and assume it is the mostly used - one. It reduces the number of font-familty attributes. */ - while (node) { - if (node->type == GFX_TEXT && node->filename) { - svg_default_font = afm_get_font_name(node->filename); - break; - } - node = node->next; - } - fputs("\n" - "\n" - "\n", - fp); - svg_start_tag(fp, "svg"); - fputs(" width=\"", fp); - svg_write_number(fp, width * canvas->zoom); - fputs("\" height=\"", fp); - svg_write_number(fp, height * canvas->zoom); - fputs("\" x=\"0\" y=\"0\" viewBox=\"", fp); - svg_write_number(fp, -LINEOFFSET); - fputs(" ", fp); - svg_write_number(fp, -LINEOFFSET); - fputs(" ", fp); - svg_write_number(fp, width - LINEOFFSET); - fputs(" ", fp); - svg_write_number(fp, height - LINEOFFSET); - fputs("\" preserveAspectRatio=\"xMidYMid\"", fp); - fprintf(fp, " font-family=\"%s\"", svg_default_font); /* default font */ - fputs(" stroke-linecap=\"round\" stroke-linejoin=\"round\"", fp); - fputs(" xmlns=\"http://www.w3.org/2000/svg\"", fp); - fputs(" xmlns:xlink=\"http://www.w3.org/1999/xlink\"", fp); - svg_close_tag(fp); - svg_start_tag(fp, "rect"); - fprintf(fp, " x=\"0\" y=\"0\" width=\"%d\" height=\"%d\"", width, height); - svg_write_color(fp, background, "fill"); - svg_close_tag_empty_node(fp); - node = canvas->firstnode; - while (node) { - switch (node->type) { - case GFX_LINE: - svg_multi_path(fp, &node); - break; - case GFX_AREA: - svg_area(fp, node); - break; - case GFX_TEXT: - svg_text(fp, node); - } - node = node->next; - } - svg_end_tag(fp, "svg"); - return 0; -} - -/* ------- EPS ------- - EPS and Postscript references: - http://partners.adobe.com/asn/developer/technotes/postscript.html -*/ - -typedef struct eps_font { - const char *ps_font; - int id; - struct eps_font *next; -} eps_font; - -typedef struct eps_state { - FILE *fp; - gfx_canvas_t *canvas; - art_u32 page_width, page_height; - eps_font *font_list; - /*--*/ - gfx_color_t color; - const char *font; - double font_size; double line_width; - int linecap, linejoin; - int has_dash; -} eps_state; - -static void eps_set_color( - eps_state *state, - gfx_color_t color) -{ -#if USE_EPS_FAKE_ALPHA - double a1, a2; -#endif - /* gfx_color_t is RRGGBBAA */ - if (state->color == color) - return; -#if USE_EPS_FAKE_ALPHA - a1 = (color & 255) / 255.0; - a2 = 255 * (1 - a1); -#define eps_color_calc(x) (int)( ((x) & 255) * a1 + a2) -#else -#define eps_color_calc(x) (int)( (x) & 255) -#endif - /* gfx_color_t is RRGGBBAA */ - if (state->color == color) - return; - fprintf(state->fp, "%d %d %d Rgb\n", - eps_color_calc(color >> 24), - eps_color_calc(color >> 16), eps_color_calc(color >> 8)); - state->color = color; -} - -static int eps_add_font( - eps_state *state, - gfx_node_t *node) -{ - /* The fonts list could be postponed to the end using - (atend), but let's be nice and have them in the header. */ - const char *ps_font = afm_get_font_postscript_name(node->filename); - eps_font *ef; - - for (ef = state->font_list; ef; ef = ef->next) { - if (!strcmp(ps_font, ef->ps_font)) - return 0; - } - ef = malloc(sizeof(eps_font)); - if (ef == NULL) { - rrd_set_error("malloc for eps_font"); - return -1; - } - ef->next = state->font_list; - ef->ps_font = ps_font; - state->font_list = ef; - return 0; -} - -static void eps_list_fonts( - eps_state *state, - const char *dscName) -{ - eps_font *ef; - int lineLen = strlen(dscName); - - if (!state->font_list) - return; - fputs(dscName, state->fp); - for (ef = state->font_list; ef; ef = ef->next) { - int nameLen = strlen(ef->ps_font); - - if (lineLen + nameLen > 100 && lineLen) { - fputs("\n", state->fp); - fputs("%%- \n", state->fp); - lineLen = 5; - } else { - fputs(" ", state->fp); - lineLen++; - } - fputs(ef->ps_font, state->fp); - lineLen += nameLen; - } - fputs("\n", state->fp); -} - -static void eps_define_fonts( - eps_state *state) -{ - eps_font *ef; - - if (!state->font_list) - return; - for (ef = state->font_list; ef; ef = ef->next) { - /* PostScript¨ LANGUAGE REFERENCE third edition - page 349 */ - fprintf(state->fp, - "%%\n" - "/%s findfont dup length dict begin\n" - "{ 1 index /FID ne {def} {pop pop} ifelse } forall\n" - "/Encoding ISOLatin1Encoding def\n" - "currentdict end\n" - "/%s-ISOLatin1 exch definefont pop\n" - "/SetFont-%s { /%s-ISOLatin1 findfont exch scalefont setfont } bd\n", - ef->ps_font, ef->ps_font, ef->ps_font, ef->ps_font); - } -} - -static int eps_prologue( - eps_state *state) -{ - gfx_node_t *node; - - fputs("%!PS-Adobe-3.0 EPSF-3.0\n" - "%%Creator: RRDtool " PACKAGE_VERSION - " Tobias Oetiker, http://tobi.oetiker.ch\n" - /* can't like weird chars here */ - "%%Title: (RRDtool output)\n" - "%%DocumentData: Clean7Bit\n" "", state->fp); - fprintf(state->fp, "%%%%BoundingBox: 0 0 %d %d\n", - state->page_width, state->page_height); - for (node = state->canvas->firstnode; node; node = node->next) { - if (node->type == GFX_TEXT && eps_add_font(state, node) == -1) - return -1; - } - eps_list_fonts(state, "%%DocumentFonts:"); - eps_list_fonts(state, "%%DocumentNeededFonts:"); - fputs("%%EndComments\n" "%%BeginProlog\n" "%%EndProlog\n" /* must have, or BoundingBox is ignored */ - "/bd { bind def } bind def\n" "", state->fp); - fprintf(state->fp, "/X { %.2f add } bd\n", LINEOFFSET); - fputs("/X2 {X exch X exch} bd\n" - "/M {X2 moveto} bd\n" - "/L {X2 lineto} bd\n" - "/m {moveto} bd\n" - "/l {lineto} bd\n" - "/S {stroke} bd\n" - "/CP {closepath} bd\n" - "/WS {setlinewidth stroke} bd\n" - "/F {fill} bd\n" - "/T1 {gsave} bd\n" - "/T2 {concat 0 0 moveto show grestore} bd\n" - "/T {moveto show} bd\n" - "/Rgb { 255.0 div 3 1 roll\n" - " 255.0 div 3 1 roll \n" - " 255.0 div 3 1 roll setrgbcolor } bd\n" "", state->fp); - eps_define_fonts(state); - return 0; -} - -static void eps_clear_dash( - eps_state *state) -{ - if (!state->has_dash) - return; - state->has_dash = 0; - fputs("[1 0] 0 setdash\n", state->fp); -} - -static void eps_write_linearea( - eps_state *state, - gfx_node_t *node) -{ - int i; - FILE *fp = state->fp; - int useOffset = 0; - int clearDashIfAny = 1; - - eps_set_color(state, node->color); - if (node->type == GFX_LINE) { - svg_dash dash_info; - - if (state->linecap != 1) { - fputs("1 setlinecap\n", fp); - state->linecap = 1; - } - if (state->linejoin != 1) { - fputs("1 setlinejoin\n", fp); - state->linejoin = 1; - } - svg_get_dash(node, &dash_info); - if (dash_info.dash_enable) { - clearDashIfAny = 0; - state->has_dash = 1; - fputs("[", fp); - svg_write_number(fp, dash_info.adjusted_on); - fputs(" ", fp); - svg_write_number(fp, dash_info.adjusted_off); - fputs("] ", fp); - svg_write_number(fp, dash_info.dash_offset); - fputs(" setdash\n", fp); - } - } - if (clearDashIfAny) - eps_clear_dash(state); - for (i = 0; i < node->points; i++) { - ArtVpath *vec = node->path + i; - double x = vec->x; - double y = state->page_height - vec->y; - - if (vec->code == ART_MOVETO_OPEN || vec->code == ART_MOVETO) - useOffset = (fabs(x - floor(x) - 0.5) < 0.01 - && fabs(y - floor(y) - 0.5) < 0.01); - if (useOffset) { - x -= LINEOFFSET; - y -= LINEOFFSET; - } - switch (vec->code) { - case ART_MOVETO_OPEN: /* fall-through */ - case ART_MOVETO: - svg_write_number(fp, x); - fputc(' ', fp); - svg_write_number(fp, y); - fputc(' ', fp); - fputs(useOffset ? "M\n" : "m\n", fp); - break; - case ART_LINETO: - svg_write_number(fp, x); - fputc(' ', fp); - svg_write_number(fp, y); - fputc(' ', fp); - fputs(useOffset ? "L\n" : "l\n", fp); - break; - case ART_CURVETO: - break; /* unsupported */ - case ART_END: - break; /* nop */ - } - } - if (node->type == GFX_LINE) { - if (node->closed_path) - fputs("CP ", fp); - if (node->size != state->line_width) { - state->line_width = node->size; - svg_write_number(fp, state->line_width); - fputs(" WS\n", fp); - } else { - fputs("S\n", fp); - } - } else { - fputs("F\n", fp); - } -} - -static void eps_write_text( - eps_state *state, - gfx_node_t *node) -{ - FILE *fp = state->fp; - const char *ps_font = afm_get_font_postscript_name(node->filename); - int lineLen = 0; - pdf_coords g; - -#ifdef HAVE_MBSTOWCS - size_t clen; - wchar_t *p, *cstr, ch; - int text_count; - - if (!node->text) - return; - clen = strlen(node->text) + 1; - cstr = malloc(sizeof(wchar_t) * clen); - text_count = mbstowcs(cstr, node->text, clen); - if (text_count == -1) - text_count = mbstowcs(cstr, "Enc-Err", 6); - p = cstr; -#else - const unsigned char *p = node->text; - unsigned char ch; - - if (!p) - return; -#endif - pdf_calc(state->page_height, node, &g); - eps_set_color(state, node->color); - if (strcmp(ps_font, state->font) || node->size != state->font_size) { - state->font = ps_font; - state->font_size = node->size; - svg_write_number(fp, state->font_size); - fprintf(fp, " SetFont-%s\n", state->font); - } - if (node->angle) - fputs("T1 ", fp); - fputs("(", fp); - lineLen = 20; - while (1) { - ch = *p; - if (!ch) - break; - ch = afm_fix_osx_charset(ch); /* unsafe macro */ - if (++lineLen > 70) { - fputs("\\\n", fp); /* backslash and \n */ - lineLen = 0; - } - switch (ch) { - case '%': - case '(': - case ')': - case '\\': - fputc('\\', fp); - fputc(ch, fp); - break; - case '\n': - fputs("\\n", fp); - break; - case '\r': - fputs("\\r", fp); - break; - case '\t': - fputs("\\t", fp); - break; - default: - if (ch > 255) { - fputc('?', fp); - } else if (ch >= 126 || ch < 32) { - fprintf(fp, "\\%03o", (unsigned int) ch); - lineLen += 3; - } else { - fputc(ch, fp); - } - } - p++; - } -#ifdef HAVE_MBSTOWCS - free(cstr); -#endif - if (node->angle) { - /* can't use svg_write_number as 2 decimals is far from enough to avoid - skewed text */ - fprintf(fp, ") [%f %f %f %f %f %f] T2\n", - g.ma, g.mb, g.mc, g.md, g.tmx, g.tmy); - } else { - fputs(") ", fp); - svg_write_number(fp, g.tmx); - fputs(" ", fp); - svg_write_number(fp, g.tmy); - fputs(" T\n", fp); - } -} - -static int eps_write_content( - eps_state *state) -{ - gfx_node_t *node; - - fputs("%\n", state->fp); - for (node = state->canvas->firstnode; node; node = node->next) { - switch (node->type) { - case GFX_LINE: - case GFX_AREA: - eps_write_linearea(state, node); - break; - case GFX_TEXT: - eps_write_text(state, node); - break; - } - } - return 0; -} - -int gfx_render_eps( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fp) -{ - struct eps_state state; - - state.fp = fp; - state.canvas = canvas; - state.page_width = width; - state.page_height = height; - state.font = "no-default-font"; - state.font_size = -1; - state.color = 0; /* black */ - state.font_list = NULL; - state.linecap = -1; - state.linejoin = -1; - state.has_dash = 0; - state.line_width = 1; - if (eps_prologue(&state) == -1) - return -1; - eps_set_color(&state, background); - fprintf(fp, "0 0 M 0 %d L %d %d L %d 0 L fill\n", - height, width, height, width); - if (eps_write_content(&state) == -1) - return 0; - fputs("showpage\n", fp); - fputs("%%EOF\n", fp); - while (state.font_list) { - eps_font *next = state.font_list->next; - - free(state.font_list); - state.font_list = next; - } - return 0; -} - -/* ------- PDF ------- - PDF references page: - http://partners.adobe.com/public/developer/pdf/index_reference.html -*/ - -typedef struct pdf_buffer { - int id, is_obj, is_dict, is_stream, pdf_file_pos; - char *data; - int alloc_size, current_size; - struct pdf_buffer *previous_buffer, *next_buffer; - struct pdf_state *state; -} pdf_buffer; - -typedef struct pdf_font { - const char *ps_font; - pdf_buffer obj; - struct pdf_font *next; -} pdf_font; - -typedef struct pdf_state { - FILE *fp; - gfx_canvas_t *canvas; - art_u32 page_width, page_height; - pdf_font *font_list; - pdf_buffer *first_buffer, *last_buffer; - int pdf_file_pos; - int has_failed; - /*--*/ - gfx_color_t stroke_color, fill_color; - int font_id; - double font_size; - double line_width; - svg_dash dash; - int linecap, linejoin; - int last_obj_id; - /*--*/ - pdf_buffer pdf_header; - pdf_buffer info_obj, catalog_obj, pages_obj, page1_obj; - pdf_buffer fontsdict_obj; - pdf_buffer graph_stream; -} pdf_state; - -static void pdf_init_buffer( - pdf_state *state, - pdf_buffer *buf) -{ - int initial_size = 32; - - buf->state = state; - buf->id = -42; - buf->alloc_size = 0; - buf->current_size = 0; - buf->data = (char *) malloc(initial_size); - buf->is_obj = 0; - buf->previous_buffer = NULL; - buf->next_buffer = NULL; - if (buf->data == NULL) { - rrd_set_error("malloc for pdf_buffer data"); - state->has_failed = 1; - return; - } - buf->alloc_size = initial_size; - if (state->last_buffer) - state->last_buffer->next_buffer = buf; - if (state->first_buffer == NULL) - state->first_buffer = buf; - buf->previous_buffer = state->last_buffer; - state->last_buffer = buf; -} - -static void pdf_put( - pdf_buffer *buf, - const char *text, - int len) -{ - if (len <= 0) - return; - if (buf->alloc_size < buf->current_size + len) { - int new_size = buf->alloc_size; - char *new_buf; - - while (new_size < buf->current_size + len) - new_size *= 4; - new_buf = (char *) malloc(new_size); - if (new_buf == NULL) { - rrd_set_error("re-malloc for pdf_buffer data"); - buf->state->has_failed = 1; - return; - } - memcpy(new_buf, buf->data, buf->current_size); - free(buf->data); - buf->data = new_buf; - buf->alloc_size = new_size; - } - memcpy(buf->data + buf->current_size, text, len); - buf->current_size += len; -} - -static void pdf_put_char( - pdf_buffer *buf, - char c) -{ - if (buf->alloc_size >= buf->current_size + 1) { - buf->data[buf->current_size++] = c; - } else { - char tmp[1]; - - tmp[0] = (char) c; - pdf_put(buf, tmp, 1); - } -} - -static void pdf_puts( - pdf_buffer *buf, - const char *text) -{ - pdf_put(buf, text, strlen(text)); -} - -static void pdf_indent( - pdf_buffer *buf) -{ - pdf_puts(buf, "\t"); -} - -static void pdf_putsi( - pdf_buffer *buf, - const char *text) -{ - pdf_indent(buf); - pdf_puts(buf, text); -} - -static void pdf_putint( - pdf_buffer *buf, - int i) -{ - char tmp[20]; - - sprintf(tmp, "%d", i); - pdf_puts(buf, tmp); -} - -static void pdf_putnumber( - pdf_buffer *buf, - double d) -{ - char tmp[50]; - - svg_format_number(tmp, sizeof(tmp), d); - pdf_puts(buf, tmp); -} - -static void pdf_put_string_contents_wide( - pdf_buffer *buf, - const afm_char * text) -{ - const afm_char *p = text; - - while (1) { - afm_char ch = *p; - - ch = afm_fix_osx_charset(ch); /* unsafe macro */ - switch (ch) { - case 0: - return; - case '(': - pdf_puts(buf, "\\("); - break; - case ')': - pdf_puts(buf, "\\)"); - break; - case '\\': - pdf_puts(buf, "\\\\"); - break; - case '\n': - pdf_puts(buf, "\\n"); - break; - case '\r': - pdf_puts(buf, "\\r"); - break; - case '\t': - pdf_puts(buf, "\\t"); - break; - default: - if (ch > 255) { - pdf_put_char(buf, '?'); - } else if (ch > 125 || ch < 32) { - pdf_put_char(buf, ch); - } else { - char tmp[10]; - - snprintf(tmp, sizeof(tmp), "\\%03o", (int) ch); - pdf_puts(buf, tmp); - } - } - p++; - } -} - -static void pdf_put_string_contents( - pdf_buffer *buf, - const char *text) -{ -#ifdef HAVE_MBSTOWCS - size_t clen = strlen(text) + 1; - wchar_t *cstr = malloc(sizeof(wchar_t) * clen); - int text_count = mbstowcs(cstr, text, clen); - - if (text_count == -1) - text_count = mbstowcs(cstr, "Enc-Err", 6); - pdf_put_string_contents_wide(buf, cstr); -#if 0 - if (*text == 'W') { - fprintf(stderr, "Decoding utf8 for '%s'\n", text); - wchar_t *p = cstr; - char *pp = text; - - fprintf(stderr, "sz wc = %d\n", sizeof(wchar_t)); - while (*p) { - fprintf(stderr, " %d = %c versus %d = %c\n", *p, (char) *p, - 255 & (int) *pp, *pp); - p++; - pp++; - } - } -#endif - free(cstr); -#else - pdf_put_string_contents_wide(buf, text); -#endif -} - -static void pdf_init_object( - pdf_state *state, - pdf_buffer *buf) -{ - pdf_init_buffer(state, buf); - buf->id = ++state->last_obj_id; - buf->is_obj = 1; - buf->is_stream = 0; -} - -static void pdf_init_dict( - pdf_state *state, - pdf_buffer *buf) -{ - pdf_init_object(state, buf); - buf->is_dict = 1; -} - -static void pdf_set_color( - pdf_buffer *buf, - gfx_color_t color, - gfx_color_t *current_color, - const char *op) -{ -#if USE_PDF_FAKE_ALPHA - double a1, a2; -#endif - /* gfx_color_t is RRGGBBAA */ - if (*current_color == color) - return; -#if USE_PDF_FAKE_ALPHA - a1 = (color & 255) / 255.0; - a2 = 1 - a1; -#define pdf_color_calc(x) ( ((x) & 255) / 255.0 * a1 + a2) -#else -#define pdf_color_calc(x) ( ((x) & 255) / 255.0) -#endif - pdf_putnumber(buf, pdf_color_calc(color >> 24)); - pdf_puts(buf, " "); - pdf_putnumber(buf, pdf_color_calc(color >> 16)); - pdf_puts(buf, " "); - pdf_putnumber(buf, pdf_color_calc(color >> 8)); - pdf_puts(buf, " "); - pdf_puts(buf, op); - pdf_puts(buf, "\n"); - *current_color = color; -} - -static void pdf_set_stroke_color( - pdf_buffer *buf, - gfx_color_t color) -{ - pdf_set_color(buf, color, &buf->state->stroke_color, "RG"); -} - -static void pdf_set_fill_color( - pdf_buffer *buf, - gfx_color_t color) -{ - pdf_set_color(buf, color, &buf->state->fill_color, "rg"); -} - -static pdf_font *pdf_find_font( - pdf_state *state, - gfx_node_t *node) -{ - const char *ps_font = afm_get_font_postscript_name(node->filename); - pdf_font *ef; - - for (ef = state->font_list; ef; ef = ef->next) { - if (!strcmp(ps_font, ef->ps_font)) - return ef; - } - return NULL; -} - -static void pdf_add_font( - pdf_state *state, - gfx_node_t *node) -{ - pdf_font *ef = pdf_find_font(state, node); - - if (ef) - return; - ef = malloc(sizeof(pdf_font)); - if (ef == NULL) { - rrd_set_error("malloc for pdf_font"); - state->has_failed = 1; - return; - } - pdf_init_dict(state, &ef->obj); - ef->next = state->font_list; - ef->ps_font = afm_get_font_postscript_name(node->filename); - state->font_list = ef; - /* fonts dict */ - pdf_putsi(&state->fontsdict_obj, "/F"); - pdf_putint(&state->fontsdict_obj, ef->obj.id); - pdf_puts(&state->fontsdict_obj, " "); - pdf_putint(&state->fontsdict_obj, ef->obj.id); - pdf_puts(&state->fontsdict_obj, " 0 R\n"); - /* fonts def */ - pdf_putsi(&ef->obj, "/Type /Font\n"); - pdf_putsi(&ef->obj, "/Subtype /Type1\n"); - pdf_putsi(&ef->obj, "/Name /F"); - pdf_putint(&ef->obj, ef->obj.id); - pdf_puts(&ef->obj, "\n"); - pdf_putsi(&ef->obj, "/BaseFont /"); - pdf_puts(&ef->obj, ef->ps_font); - pdf_puts(&ef->obj, "\n"); - pdf_putsi(&ef->obj, "/Encoding /WinAnsiEncoding\n"); - /* 'Cp1252' (this is latin 1 extended with 27 characters; - the encoding is also known as 'winansi') - http://www.lowagie.com/iText/tutorial/ch09.html */ -} - -static void pdf_create_fonts( - pdf_state *state) -{ - gfx_node_t *node; - - for (node = state->canvas->firstnode; node; node = node->next) { - if (node->type == GFX_TEXT) - pdf_add_font(state, node); - } -} - -static void pdf_write_linearea( - pdf_state *state, - gfx_node_t *node) -{ - int i; - pdf_buffer *s = &state->graph_stream; - - if (node->type == GFX_LINE) { - svg_dash dash_info; - - svg_get_dash(node, &dash_info); - if (!svg_dash_equal(&dash_info, &state->dash)) { - state->dash = dash_info; - if (dash_info.dash_enable) { - pdf_puts(s, "["); - pdf_putnumber(s, dash_info.adjusted_on); - pdf_puts(s, " "); - pdf_putnumber(s, dash_info.adjusted_off); - pdf_puts(s, "] "); - pdf_putnumber(s, dash_info.dash_offset); - pdf_puts(s, " d\n"); - } else { - pdf_puts(s, "[] 0 d\n"); - } - } - pdf_set_stroke_color(s, node->color); - if (state->linecap != 1) { - pdf_puts(s, "1 j\n"); - state->linecap = 1; - } - if (state->linejoin != 1) { - pdf_puts(s, "1 J\n"); - state->linejoin = 1; - } - if (node->size != state->line_width) { - state->line_width = node->size; - pdf_putnumber(s, state->line_width); - pdf_puts(s, " w\n"); - } - } else { - pdf_set_fill_color(s, node->color); - } - for (i = 0; i < node->points; i++) { - ArtVpath *vec = node->path + i; - double x = vec->x; - double y = state->page_height - vec->y; - - if (node->type == GFX_AREA) { - x += LINEOFFSET; /* adjust for libart handling of areas */ - y -= LINEOFFSET; - } - switch (vec->code) { - case ART_MOVETO_OPEN: /* fall-through */ - case ART_MOVETO: - pdf_putnumber(s, x); - pdf_puts(s, " "); - pdf_putnumber(s, y); - pdf_puts(s, " m\n"); - break; - case ART_LINETO: - pdf_putnumber(s, x); - pdf_puts(s, " "); - pdf_putnumber(s, y); - pdf_puts(s, " l\n"); - break; - case ART_CURVETO: - break; /* unsupported */ - case ART_END: - break; /* nop */ - } - } - if (node->type == GFX_LINE) { - pdf_puts(s, node->closed_path ? "s\n" : "S\n"); - } else { - pdf_puts(s, "f\n"); - } -} - - -static void pdf_write_matrix( - pdf_state *state, - gfx_node_t *node, - pdf_coords * g, - int useTM) -{ - char tmp[150]; - pdf_buffer *s = &state->graph_stream; - - if (node->angle == 0) { - pdf_puts(s, "1 0 0 1 "); - pdf_putnumber(s, useTM ? g->tmx : g->mx); - pdf_puts(s, " "); - pdf_putnumber(s, useTM ? g->tmy : g->my); - } else { - /* can't use svg_write_number as 2 decimals is far from enough to avoid - skewed text */ - sprintf(tmp, "%f %f %f %f %f %f", - g->ma, g->mb, g->mc, g->md, - useTM ? g->tmx : g->mx, useTM ? g->tmy : g->my); - pdf_puts(s, tmp); - } -} - -static void pdf_write_text( - pdf_state *state, - gfx_node_t *node, - int last_was_text, - int next_is_text) -{ - pdf_coords g; - pdf_buffer *s = &state->graph_stream; - pdf_font *font = pdf_find_font(state, node); - - if (font == NULL) { - rrd_set_error("font disappeared"); - state->has_failed = 1; - return; - } - pdf_calc(state->page_height, node, &g); -#if PDF_CALC_DEBUG - pdf_puts(s, "q % debug green box\n"); - pdf_write_matrix(state, node, &g, 0); - pdf_puts(s, " cm\n"); - pdf_set_fill_color(s, 0x90FF9000); - pdf_puts(s, "0 0.4 0 rg\n"); - pdf_puts(s, "0 0 "); - pdf_putnumber(s, g.sizep.x); - pdf_puts(s, " "); - pdf_putnumber(s, g.sizep.y); - pdf_puts(s, " re\n"); - pdf_puts(s, "f\n"); - pdf_puts(s, "Q\n"); -#endif - pdf_set_fill_color(s, node->color); - if (PDF_CALC_DEBUG || !last_was_text) - pdf_puts(s, "BT\n"); - if (state->font_id != font->obj.id || node->size != state->font_size) { - state->font_id = font->obj.id; - state->font_size = node->size; - pdf_puts(s, "/F"); - pdf_putint(s, font->obj.id); - pdf_puts(s, " "); - pdf_putnumber(s, node->size); - pdf_puts(s, " Tf\n"); - } - pdf_write_matrix(state, node, &g, 1); - pdf_puts(s, " Tm\n"); - pdf_puts(s, "("); - pdf_put_string_contents(s, node->text); - pdf_puts(s, ") Tj\n"); - if (PDF_CALC_DEBUG || !next_is_text) - pdf_puts(s, "ET\n"); -} - -static void pdf_write_content( - pdf_state *state) -{ - gfx_node_t *node; - int last_was_text = 0, next_is_text; - - for (node = state->canvas->firstnode; node; node = node->next) { - switch (node->type) { - case GFX_LINE: - case GFX_AREA: - pdf_write_linearea(state, node); - break; - case GFX_TEXT: - next_is_text = node->next && node->next->type == GFX_TEXT; - pdf_write_text(state, node, last_was_text, next_is_text); - break; - } - last_was_text = node->type == GFX_TEXT; - } -} - -static void pdf_init_document( - pdf_state *state) -{ - pdf_init_buffer(state, &state->pdf_header); - pdf_init_dict(state, &state->catalog_obj); - pdf_init_dict(state, &state->info_obj); - pdf_init_dict(state, &state->pages_obj); - pdf_init_dict(state, &state->page1_obj); - pdf_init_dict(state, &state->fontsdict_obj); - pdf_create_fonts(state); - if (state->has_failed) - return; - /* make stream last object in file */ - pdf_init_object(state, &state->graph_stream); - state->graph_stream.is_stream = 1; -} - -static void pdf_setup_document( - pdf_state *state) -{ - const char *creator = - "RRDtool " PACKAGE_VERSION " Tobias Oetiker, http://tobi.oetiker.ch"; - /* all objects created by now, so init code can reference them */ - /* HEADER */ - pdf_puts(&state->pdf_header, "%PDF-1.3\n"); - /* following 8 bit comment is recommended by Adobe for - indicating binary file to file transfer applications */ - pdf_puts(&state->pdf_header, "%\xE2\xE3\xCF\xD3\n"); - /* INFO */ - pdf_putsi(&state->info_obj, "/Creator ("); - pdf_put_string_contents(&state->info_obj, creator); - pdf_puts(&state->info_obj, ")\n"); - /* CATALOG */ - pdf_putsi(&state->catalog_obj, "/Type /Catalog\n"); - pdf_putsi(&state->catalog_obj, "/Pages "); - pdf_putint(&state->catalog_obj, state->pages_obj.id); - pdf_puts(&state->catalog_obj, " 0 R\n"); - /* PAGES */ - pdf_putsi(&state->pages_obj, "/Type /Pages\n"); - pdf_putsi(&state->pages_obj, "/Kids ["); - pdf_putint(&state->pages_obj, state->page1_obj.id); - pdf_puts(&state->pages_obj, " 0 R]\n"); - pdf_putsi(&state->pages_obj, "/Count 1\n"); - /* PAGE 1 */ - pdf_putsi(&state->page1_obj, "/Type /Page\n"); - pdf_putsi(&state->page1_obj, "/Parent "); - pdf_putint(&state->page1_obj, state->pages_obj.id); - pdf_puts(&state->page1_obj, " 0 R\n"); - pdf_putsi(&state->page1_obj, "/MediaBox [0 0 "); - pdf_putint(&state->page1_obj, state->page_width); - pdf_puts(&state->page1_obj, " "); - pdf_putint(&state->page1_obj, state->page_height); - pdf_puts(&state->page1_obj, "]\n"); - pdf_putsi(&state->page1_obj, "/Contents "); - pdf_putint(&state->page1_obj, state->graph_stream.id); - pdf_puts(&state->page1_obj, " 0 R\n"); - pdf_putsi(&state->page1_obj, "/Resources << /Font "); - pdf_putint(&state->page1_obj, state->fontsdict_obj.id); - pdf_puts(&state->page1_obj, " 0 R >>\n"); -} - -static void pdf_write_string_to_file( - pdf_state *state, - const char *text) -{ - fputs(text, state->fp); - state->pdf_file_pos += strlen(text); -} - -static void pdf_write_buf_to_file( - pdf_state *state, - pdf_buffer *buf) -{ - char tmp[40]; - - buf->pdf_file_pos = state->pdf_file_pos; - if (buf->is_obj) { - snprintf(tmp, sizeof(tmp), "%d 0 obj\n", buf->id); - pdf_write_string_to_file(state, tmp); - } - if (buf->is_dict) - pdf_write_string_to_file(state, "<<\n"); - if (buf->is_stream) { - snprintf(tmp, sizeof(tmp), "<< /Length %d >>\n", buf->current_size); - pdf_write_string_to_file(state, tmp); - pdf_write_string_to_file(state, "stream\n"); - } - fwrite(buf->data, 1, buf->current_size, state->fp); - state->pdf_file_pos += buf->current_size; - if (buf->is_stream) - pdf_write_string_to_file(state, "endstream\n"); - if (buf->is_dict) - pdf_write_string_to_file(state, ">>\n"); - if (buf->is_obj) - pdf_write_string_to_file(state, "endobj\n"); -} - -static void pdf_write_to_file( - pdf_state *state) -{ - pdf_buffer *buf = state->first_buffer; - int xref_pos; - - state->pdf_file_pos = 0; - pdf_write_buf_to_file(state, &state->pdf_header); - while (buf) { - if (buf->is_obj) - pdf_write_buf_to_file(state, buf); - buf = buf->next_buffer; - } - xref_pos = state->pdf_file_pos; - fprintf(state->fp, "xref\n"); - fprintf(state->fp, "%d %d\n", 0, state->last_obj_id + 1); - /* TOC lines must be exactly 20 bytes including \n */ - fprintf(state->fp, "%010d %05d f\x20\n", 0, 65535); - for (buf = state->first_buffer; buf; buf = buf->next_buffer) { - if (buf->is_obj) - fprintf(state->fp, "%010d %05d n\x20\n", buf->pdf_file_pos, 0); - } - fprintf(state->fp, "trailer\n"); - fprintf(state->fp, "<<\n"); - fprintf(state->fp, "\t/Size %d\n", state->last_obj_id + 1); - fprintf(state->fp, "\t/Root %d 0 R\n", state->catalog_obj.id); - fprintf(state->fp, "\t/Info %d 0 R\n", state->info_obj.id); - fprintf(state->fp, ">>\n"); - fprintf(state->fp, "startxref\n"); - fprintf(state->fp, "%d\n", xref_pos); - fputs("%%EOF\n", state->fp); -} - -static void pdf_free_resources( - pdf_state *state) -{ - pdf_buffer *buf = state->first_buffer; - - while (buf) { - free(buf->data); - buf->data = NULL; - buf->alloc_size = buf->current_size = 0; - buf = buf->next_buffer; - } - while (state->font_list) { - pdf_font *next = state->font_list->next; - - free(state->font_list); - state->font_list = next; - } -} - -int gfx_render_pdf( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t UNUSED(background), - FILE * fp) -{ - struct pdf_state state; - - memset(&state, 0, sizeof(pdf_state)); - state.fp = fp; - state.canvas = canvas; - state.page_width = width; - state.page_height = height; - state.font_id = -1; - state.font_size = -1; - state.font_list = NULL; - state.linecap = -1; - state.linejoin = -1; - pdf_init_document(&state); - /* - pdf_set_color(&state, background); - fprintf(fp, "0 0 M 0 %d L %d %d L %d 0 L fill\n", - height, width, height, width); - */ - if (!state.has_failed) - pdf_write_content(&state); - if (!state.has_failed) - pdf_setup_document(&state); - if (!state.has_failed) - pdf_write_to_file(&state); - pdf_free_resources(&state); - return state.has_failed ? -1 : 0; + double line_height; + + cairo_user_to_device(cr, x, y); + line_width = cairo_get_line_width(cr); + line_height = line_width; + cairo_user_to_device_distance(cr, &line_width, &line_height); + line_width = line_width / 2.0 - (long) (line_width / 2.0); + line_height = line_height / 2.0 - (long) (line_height / 2.0); + *x = (double) ((long) (*x + 0.5)) + line_width; + *y = (double) ((long) (*y + 0.5)) + line_height; + cairo_device_to_user(cr, x, y); +} + +/* gridfit_areas */ + +void gfx_area_fit( + cairo_t * cr, + double *x, + double *y) +{ + cairo_user_to_device(cr, x, y); + *x = (double) ((long) (*x + 0.5)); + *y = (double) ((long) (*y + 0.5)); + cairo_device_to_user(cr, x, y); } diff --git a/program/src/rrd_gfx.h b/program/src/rrd_gfx.h index dacdd694..c3cd1e39 100644 --- a/program/src/rrd_gfx.h +++ b/program/src/rrd_gfx.h @@ -4,64 +4,35 @@ * rrd_gfx.h generic graphics adapter library ****************************************************************************/ -#ifndef RRD_GFX_H +#ifndef RRD_GFX_H #define RRD_GFX_H -#define LIBART_COMPILATION -#define y0 libart_y0 -#define y1 libart_y1 -#define gamma libart_gamma -#include -#include -#include "art_rgba_svp.h" -#undef gamma -#undef y0 -#undef y1 +#define y0 cairo_y0 +#define y1 cairo_y1 +#define index cairo_index +#include +#include +#include +#include enum gfx_if_en { IF_PNG = 0, IF_SVG, IF_EPS, IF_PDF }; enum gfx_en { GFX_LINE = 0, GFX_AREA, GFX_TEXT }; enum gfx_h_align_en { GFX_H_NULL = 0, GFX_H_LEFT, GFX_H_RIGHT, GFX_H_CENTER }; enum gfx_v_align_en { GFX_V_NULL = 0, GFX_V_TOP, GFX_V_BOTTOM, GFX_V_CENTER }; -enum gfx_aa_type_en { AA_NORMAL = 0, AA_LIGHT, AA_NONE }; -typedef unsigned long gfx_color_t; - -typedef struct gfx_node_t { - enum gfx_en type; /* type of graph element */ - gfx_color_t color; /* color of element 0xRRGGBBAA alpha 0xff is solid */ - double size; /* font size, line width */ - double dash_on, dash_off; /* dash line fragments lengths */ - int closed_path; - int points; - int points_max; - char *filename; /* font or image filename */ - char *text; - ArtVpath *path; /* path */ - double x, y; /* position */ - double angle; /* text angle */ - enum gfx_h_align_en halign; /* text alignement */ - enum gfx_v_align_en valign; /* text alignement */ - double tabwidth; - struct gfx_node_t *next; -} gfx_node_t; - - -typedef struct gfx_canvas_t { - struct gfx_node_t *firstnode; - struct gfx_node_t *lastnode; - enum gfx_if_en imgformat; /* image format */ - int interlaced; /* will the graph be interlaced? */ - double zoom; /* zoom for graph */ - double font_aa_threshold; /* no anti-aliasing for sizes <= */ - enum gfx_aa_type_en aa_type; /* anti-aliasing type (normal/light/none) */ -} gfx_canvas_t; - -gfx_canvas_t *gfx_new_canvas( - void); + +/* cairo color components */ +typedef struct gfx_color_t { + double red; + double green; + double blue; + double alpha; +} gfx_color_t; + /* create a new line */ -gfx_node_t *gfx_new_line( - gfx_canvas_t *canvas, +void gfx_line( + cairo_t * cr, double X0, double Y0, double X1, @@ -69,8 +40,8 @@ gfx_node_t *gfx_new_line( double width, gfx_color_t color); -gfx_node_t *gfx_new_dashed_line( - gfx_canvas_t *canvas, +void gfx_dashed_line( + cairo_t * cr, double X0, double Y0, double X1, @@ -81,8 +52,8 @@ gfx_node_t *gfx_new_dashed_line( double dash_off); /* create a new area */ -gfx_node_t *gfx_new_area( - gfx_canvas_t *canvas, +void gfx_new_area( + cairo_t * cr, double X0, double Y0, double X1, @@ -92,19 +63,19 @@ gfx_node_t *gfx_new_area( gfx_color_t color); /* add a point to a line or to an area */ -int gfx_add_point( - gfx_node_t *node, +void gfx_add_point( + cairo_t * cr, double x, double y); /* close current path so it ends at the same point as it started */ void gfx_close_path( - gfx_node_t *node); + cairo_t * cr); /* create a text node */ -gfx_node_t *gfx_new_text( - gfx_canvas_t *canvas, +void gfx_text( + cairo_t * cr, double x, double y, gfx_color_t color, @@ -114,70 +85,27 @@ gfx_node_t *gfx_new_text( double angle, enum gfx_h_align_en h_align, enum gfx_v_align_en v_align, - char *text); + const char *text); /* measure width of a text string */ double gfx_get_text_width( - gfx_canvas_t *canvas, + cairo_t * cr, double start, char *font, double size, double tabwidth, - char *text, - int rotation); - -/* save image to file */ -int gfx_render( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fo); - -/* free memory used by nodes this will also remove memory required for - node chain and associated material */ -int gfx_destroy( - gfx_canvas_t *canvas); - - -/* PNG support*/ -int gfx_render_png( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fo); -double gfx_get_text_width_libart( - gfx_canvas_t *canvas, - double start, - char *font, - double size, - double tabwidth, - char *text, - int rotation); - -/* SVG support */ -int gfx_render_svg( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fo); - -/* EPS support */ -int gfx_render_eps( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fo); - -/* PDF support */ -int gfx_render_pdf( - gfx_canvas_t *canvas, - art_u32 width, - art_u32 height, - gfx_color_t background, - FILE * fo); + char *text); + +/* convert color */ +gfx_color_t gfx_hex_to_col( + long unsigned int); +void gfx_line_fit( + cairo_t *, + double *, + double *); +void gfx_area_fit( + cairo_t *, + double *, + double *); #endif diff --git a/program/src/rrd_graph.c b/program/src/rrd_graph.c index f9c7a114..d23d0716 100644 --- a/program/src/rrd_graph.c +++ b/program/src/rrd_graph.c @@ -140,16 +140,17 @@ ylab_t ylab[] = { gfx_color_t graph_col[] = /* default colors */ -{ 0xFFFFFFFF, /* canvas */ - 0xF0F0F0FF, /* background */ - 0xD0D0D0FF, /* shade A */ - 0xA0A0A0FF, /* shade B */ - 0x90909080, /* grid */ - 0xE0505080, /* major grid */ - 0x000000FF, /* font */ - 0x802020FF, /* arrow */ - 0x202020FF, /* axis */ - 0x000000FF /* frame */ +{ + {1.00, 1.00, 1.00, 1.00}, /* canvas */ + {0.95, 0.95, 0.95, 1.00}, /* background */ + {0.81, 0.81, 0.81, 1.00}, /* shade A */ + {0.62, 0.62, 0.62, 1.00}, /* shade B */ + {0.56, 0.56, 0.56, 0.75}, /* grid */ + {0.87, 0.31, 0.31, 0.60}, /* major grid */ + {0.00, 0.00, 0.00, 1.00}, /* font */ + {0.50, 0.12, 0.12, 1.00}, /* arrow */ + {0.12, 0.12, 0.12, 1.00}, /* axis */ + {0.00, 0.00, 0.00, 1.00} /* frame */ }; @@ -225,81 +226,78 @@ enum gf_en gf_conv( char *string) { - conv_if(PRINT, GF_PRINT) - conv_if(GPRINT, GF_GPRINT) - conv_if(COMMENT, GF_COMMENT) - conv_if(HRULE, GF_HRULE) - conv_if(VRULE, GF_VRULE) - conv_if(LINE, GF_LINE) - conv_if(AREA, GF_AREA) - conv_if(STACK, GF_STACK) - conv_if(TICK, GF_TICK) - conv_if(DEF, GF_DEF) - conv_if(CDEF, GF_CDEF) - conv_if(VDEF, GF_VDEF) -#ifdef WITH_PIECHART - conv_if(PART, GF_PART) -#endif - conv_if(XPORT, GF_XPORT) - conv_if(SHIFT, GF_SHIFT) - - return (-1); + conv_if(PRINT, GF_PRINT); + conv_if(GPRINT, GF_GPRINT); + conv_if(COMMENT, GF_COMMENT); + conv_if(HRULE, GF_HRULE); + conv_if(VRULE, GF_VRULE); + conv_if(LINE, GF_LINE); + conv_if(AREA, GF_AREA); + conv_if(STACK, GF_STACK); + conv_if(TICK, GF_TICK); + conv_if(DEF, GF_DEF); + conv_if(CDEF, GF_CDEF); + conv_if(VDEF, GF_VDEF); + conv_if(XPORT, GF_XPORT); + conv_if(SHIFT, GF_SHIFT); + + return (-1); } enum gfx_if_en if_conv( char *string) { - conv_if(PNG, IF_PNG) - conv_if(SVG, IF_SVG) - conv_if(EPS, IF_EPS) - conv_if(PDF, IF_PDF) + conv_if(PNG, IF_PNG); + conv_if(SVG, IF_SVG); + conv_if(EPS, IF_EPS); + conv_if(PDF, IF_PDF); - return (-1); + return (-1); } enum tmt_en tmt_conv( char *string) { - conv_if(SECOND, TMT_SECOND) - conv_if(MINUTE, TMT_MINUTE) - conv_if(HOUR, TMT_HOUR) - conv_if(DAY, TMT_DAY) - conv_if(WEEK, TMT_WEEK) - conv_if(MONTH, TMT_MONTH) - conv_if(YEAR, TMT_YEAR) - return (-1); + conv_if(SECOND, TMT_SECOND); + conv_if(MINUTE, TMT_MINUTE); + conv_if(HOUR, TMT_HOUR); + conv_if(DAY, TMT_DAY); + conv_if(WEEK, TMT_WEEK); + conv_if(MONTH, TMT_MONTH); + conv_if(YEAR, TMT_YEAR); + return (-1); } enum grc_en grc_conv( char *string) { - conv_if(BACK, GRC_BACK) - conv_if(CANVAS, GRC_CANVAS) - conv_if(SHADEA, GRC_SHADEA) - conv_if(SHADEB, GRC_SHADEB) - conv_if(GRID, GRC_GRID) - conv_if(MGRID, GRC_MGRID) - conv_if(FONT, GRC_FONT) - conv_if(ARROW, GRC_ARROW) - conv_if(AXIS, GRC_AXIS) - conv_if(FRAME, GRC_FRAME) + conv_if(BACK, GRC_BACK); + conv_if(CANVAS, GRC_CANVAS); + conv_if(SHADEA, GRC_SHADEA); + conv_if(SHADEB, GRC_SHADEB); + conv_if(GRID, GRC_GRID); + conv_if(MGRID, GRC_MGRID); + conv_if(FONT, GRC_FONT); + conv_if(ARROW, GRC_ARROW); + conv_if(AXIS, GRC_AXIS); + conv_if(FRAME, GRC_FRAME); - return -1; + return -1; } enum text_prop_en text_prop_conv( char *string) { - conv_if(DEFAULT, TEXT_PROP_DEFAULT) - conv_if(TITLE, TEXT_PROP_TITLE) - conv_if(AXIS, TEXT_PROP_AXIS) - conv_if(UNIT, TEXT_PROP_UNIT) - conv_if(LEGEND, TEXT_PROP_LEGEND) - return -1; + conv_if(DEFAULT, TEXT_PROP_DEFAULT); + conv_if(TITLE, TEXT_PROP_TITLE); + conv_if(AXIS, TEXT_PROP_AXIS); + conv_if(UNIT, TEXT_PROP_UNIT); + conv_if(LEGEND, TEXT_PROP_LEGEND); + return -1; } @@ -326,7 +324,8 @@ int im_free( free(im->gdes[i].rpnp); } free(im->gdes); - gfx_destroy(im->canvas); + if (im->surface) + cairo_surface_destroy(im->surface); return 0; } @@ -520,6 +519,7 @@ void expand_range( #endif } + void apply_gridfit( image_desc_t *im) { @@ -1638,12 +1638,12 @@ int leg_place( /* no interleg space if string ends in \g */ fill += legspace[i]; } - fill += gfx_get_text_width(im->canvas, fill + border, + fill += gfx_get_text_width(im->cr, fill + border, im->text_prop[TEXT_PROP_LEGEND]. font, im->text_prop[TEXT_PROP_LEGEND]. size, im->tabwidth, - im->gdes[i].legend, 0); + im->gdes[i].legend); leg_c++; } else { legspace[i] = 0; @@ -1690,12 +1690,12 @@ int leg_place( im->gdes[ii].leg_x = leg_x; im->gdes[ii].leg_y = leg_y; leg_x += - gfx_get_text_width(im->canvas, leg_x, + gfx_get_text_width(im->cr, leg_x, im->text_prop[TEXT_PROP_LEGEND]. font, im->text_prop[TEXT_PROP_LEGEND]. size, im->tabwidth, - im->gdes[ii].legend, 0) + im->gdes[ii].legend) + legspace[ii] + glue; } @@ -1900,25 +1900,37 @@ int draw_horizontal_grid( } nlabels++; - gfx_new_text(im->canvas, - X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0, - im->graph_col[GRC_FONT], - im->text_prop[TEXT_PROP_AXIS].font, - im->text_prop[TEXT_PROP_AXIS].size, - im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER, - graph_label); - gfx_new_dashed_line(im->canvas, - X0 - 2, Y0, - X1 + 2, Y0, - MGRIDWIDTH, im->graph_col[GRC_MGRID], - im->grid_dash_on, im->grid_dash_off); + gfx_text(im->cr, + X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0, + im->graph_col[GRC_FONT], + im->text_prop[TEXT_PROP_AXIS].font, + im->text_prop[TEXT_PROP_AXIS].size, + im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER, + graph_label); + gfx_line(im->cr, + X0 - 2, Y0, + X0, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]); + gfx_line(im->cr, + X1, Y0, + X1 + 2, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]); + gfx_dashed_line(im->cr, + X0 - 2, Y0, + X1 + 2, Y0, + MGRIDWIDTH, im->graph_col[GRC_MGRID], + im->grid_dash_on, im->grid_dash_off); } else if (!(im->extra_flags & NOMINOR)) { - gfx_new_dashed_line(im->canvas, - X0 - 1, Y0, - X1 + 1, Y0, - GRIDWIDTH, im->graph_col[GRC_GRID], - im->grid_dash_on, im->grid_dash_off); + gfx_line(im->cr, + X0 - 2, Y0, + X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_line(im->cr, + X1, Y0, + X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_dashed_line(im->cr, + X0 - 1, Y0, + X1 + 1, Y0, + GRIDWIDTH, im->graph_col[GRC_GRID], + im->grid_dash_on, im->grid_dash_off); } } @@ -2056,11 +2068,18 @@ int horizontal_log_grid( break; /* major grid line */ - gfx_new_dashed_line(im->canvas, - X0 - 2, Y0, - X1 + 2, Y0, - MGRIDWIDTH, im->graph_col[GRC_MGRID], - im->grid_dash_on, im->grid_dash_off); + + gfx_line(im->cr, + X0 - 2, Y0, X0, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]); + gfx_line(im->cr, + X1, Y0, X1 + 2, Y0, MGRIDWIDTH, im->graph_col[GRC_MGRID]); + + + gfx_dashed_line(im->cr, + X0 - 2, Y0, + X1 + 2, Y0, + MGRIDWIDTH, im->graph_col[GRC_MGRID], + im->grid_dash_on, im->grid_dash_off); /* label */ if (im->extra_flags & FORCE_UNITS_SI) { @@ -2084,13 +2103,12 @@ int horizontal_log_grid( sprintf(graph_label, "%3.0f %c", pvalue, symbol); } else sprintf(graph_label, "%3.0e", value); - gfx_new_text(im->canvas, - X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0, - im->graph_col[GRC_FONT], - im->text_prop[TEXT_PROP_AXIS].font, - im->text_prop[TEXT_PROP_AXIS].size, - im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER, - graph_label); + gfx_text(im->cr, + X0 - im->text_prop[TEXT_PROP_AXIS].size, Y0, + im->graph_col[GRC_FONT], + im->text_prop[TEXT_PROP_AXIS].font, + im->text_prop[TEXT_PROP_AXIS].size, + im->tabwidth, 0.0, GFX_H_RIGHT, GFX_V_CENTER, graph_label); /* minor grid */ if (mid < 4 && exfrac == 1) { @@ -2119,11 +2137,17 @@ int horizontal_log_grid( break; /* draw lines */ - gfx_new_dashed_line(im->canvas, - X0 - 1, Y0, - X1 + 1, Y0, - GRIDWIDTH, im->graph_col[GRC_GRID], - im->grid_dash_on, im->grid_dash_off); + gfx_line(im->cr, + X0 - 2, Y0, + X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_line(im->cr, + X1, Y0, + X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_dashed_line(im->cr, + X0 - 1, Y0, + X1 + 1, Y0, + GRIDWIDTH, im->graph_col[GRC_GRID], + im->grid_dash_on, im->grid_dash_off); } } else if (exfrac > 1) { for (i = val_exp - exfrac / 3 * 2; i < val_exp; i += exfrac / 3) { @@ -2136,11 +2160,17 @@ int horizontal_log_grid( break; /* draw lines */ - gfx_new_dashed_line(im->canvas, - X0 - 1, Y0, - X1 + 1, Y0, - GRIDWIDTH, im->graph_col[GRC_GRID], - im->grid_dash_on, im->grid_dash_off); + gfx_line(im->cr, + X0 - 2, Y0, + X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_line(im->cr, + X1, Y0, + X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_dashed_line(im->cr, + X0 - 1, Y0, + X1 + 1, Y0, + GRIDWIDTH, im->graph_col[GRC_GRID], + im->grid_dash_on, im->grid_dash_off); } } @@ -2178,11 +2208,15 @@ int horizontal_log_grid( break; /* draw lines */ - gfx_new_dashed_line(im->canvas, - X0 - 1, Y0, - X1 + 1, Y0, - GRIDWIDTH, im->graph_col[GRC_GRID], - im->grid_dash_on, im->grid_dash_off); + gfx_line(im->cr, + X0 - 2, Y0, X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_line(im->cr, + X1, Y0, X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_dashed_line(im->cr, + X0 - 1, Y0, + X1 + 1, Y0, + GRIDWIDTH, im->graph_col[GRC_GRID], + im->grid_dash_on, im->grid_dash_off); } } /* fancy minor gridlines */ @@ -2197,11 +2231,15 @@ int horizontal_log_grid( break; /* draw lines */ - gfx_new_dashed_line(im->canvas, - X0 - 1, Y0, - X1 + 1, Y0, - GRIDWIDTH, im->graph_col[GRC_GRID], - im->grid_dash_on, im->grid_dash_off); + gfx_line(im->cr, + X0 - 2, Y0, X0, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_line(im->cr, + X1, Y0, X1 + 2, Y0, GRIDWIDTH, im->graph_col[GRC_GRID]); + gfx_dashed_line(im->cr, + X0 - 1, Y0, + X1 + 1, Y0, + GRIDWIDTH, im->graph_col[GRC_GRID], + im->grid_dash_on, im->grid_dash_off); } } @@ -2272,9 +2310,13 @@ void vertical_grid( if (ti == timajor) continue; /* skip as falls on major grid line */ X0 = xtr(im, ti); - gfx_new_dashed_line(im->canvas, X0, Y0 + 1, X0, Y1 - 1, GRIDWIDTH, - im->graph_col[GRC_GRID], - im->grid_dash_on, im->grid_dash_off); + gfx_line(im->cr, X0, Y1 - 2, X0, Y1, GRIDWIDTH, + im->graph_col[GRC_GRID]); + gfx_line(im->cr, X0, Y0, X0, Y0 + 2, GRIDWIDTH, + im->graph_col[GRC_GRID]); + gfx_dashed_line(im->cr, X0, Y1 - 1, X0, Y0 + 1, GRIDWIDTH, + im->graph_col[GRC_GRID], + im->grid_dash_on, im->grid_dash_off); } } @@ -2290,9 +2332,13 @@ void vertical_grid( if (ti < im->start || ti > im->end) continue; X0 = xtr(im, ti); - gfx_new_dashed_line(im->canvas, X0, Y0 + 3, X0, Y1 - 2, MGRIDWIDTH, - im->graph_col[GRC_MGRID], - im->grid_dash_on, im->grid_dash_off); + gfx_line(im->cr, X0, Y1 - 2, X0, Y1, MGRIDWIDTH, + im->graph_col[GRC_MGRID]); + gfx_line(im->cr, X0, Y0, X0, Y0 + 3, MGRIDWIDTH, + im->graph_col[GRC_MGRID]); + gfx_dashed_line(im->cr, X0, Y1 - 2, X0, Y0 + 3, MGRIDWIDTH, + im->graph_col[GRC_MGRID], + im->grid_dash_on, im->grid_dash_off); } /* paint the labels below the graph */ @@ -2313,13 +2359,13 @@ void vertical_grid( #else # error "your libc has no strftime I guess we'll abort the exercise here." #endif - gfx_new_text(im->canvas, - xtr(im, tilab), - Y0 + im->text_prop[TEXT_PROP_AXIS].size * 1.4 + 5, - im->graph_col[GRC_FONT], - im->text_prop[TEXT_PROP_AXIS].font, - im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, 0.0, - GFX_H_CENTER, GFX_V_BOTTOM, graph_label); + gfx_text(im->cr, + xtr(im, tilab), + Y0 + 1, + im->graph_col[GRC_FONT], + im->text_prop[TEXT_PROP_AXIS].font, + im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, 0.0, + GFX_H_CENTER, GFX_V_TOP, graph_label); } @@ -2330,29 +2376,32 @@ void axis_paint( image_desc_t *im) { /* draw x and y axis */ - /* gfx_new_line ( im->canvas, im->xorigin+im->xsize,im->yorigin, + /* gfx_line ( im->canvas, im->xorigin+im->xsize,im->yorigin, im->xorigin+im->xsize,im->yorigin-im->ysize, GRIDWIDTH, im->graph_col[GRC_AXIS]); - gfx_new_line ( im->canvas, im->xorigin,im->yorigin-im->ysize, + gfx_line ( im->canvas, im->xorigin,im->yorigin-im->ysize, im->xorigin+im->xsize,im->yorigin-im->ysize, GRIDWIDTH, im->graph_col[GRC_AXIS]); */ - gfx_new_line(im->canvas, im->xorigin - 4, im->yorigin, - im->xorigin + im->xsize + 4, im->yorigin, - MGRIDWIDTH, im->graph_col[GRC_AXIS]); + gfx_line(im->cr, im->xorigin - 4, im->yorigin, + im->xorigin + im->xsize + 4, im->yorigin, + MGRIDWIDTH, im->graph_col[GRC_AXIS]); - gfx_new_line(im->canvas, im->xorigin, im->yorigin + 4, - im->xorigin, im->yorigin - im->ysize - 4, - MGRIDWIDTH, im->graph_col[GRC_AXIS]); + gfx_line(im->cr, im->xorigin, im->yorigin + 4, + im->xorigin, im->yorigin - im->ysize - 4, + MGRIDWIDTH, im->graph_col[GRC_AXIS]); /* arrow for X and Y axis direction */ - gfx_new_area(im->canvas, im->xorigin + im->xsize + 2, im->yorigin - 2, im->xorigin + im->xsize + 2, im->yorigin + 3, im->xorigin + im->xsize + 7, im->yorigin + 0.5, /* LINEOFFSET */ + gfx_new_area(im->cr, im->xorigin + im->xsize + 2, im->yorigin - 2, im->xorigin + im->xsize + 2, im->yorigin + 3, im->xorigin + im->xsize + 7, im->yorigin + 0.5, /* LINEOFFSET */ im->graph_col[GRC_ARROW]); + gfx_close_path(im->cr); - gfx_new_area(im->canvas, im->xorigin - 2, im->yorigin - im->ysize - 2, im->xorigin + 3, im->yorigin - im->ysize - 2, im->xorigin + 0.5, im->yorigin - im->ysize - 7, /* LINEOFFSET */ + gfx_new_area(im->cr, im->xorigin - 2, im->yorigin - im->ysize - 2, im->xorigin + 3, im->yorigin - im->ysize - 2, im->xorigin + 0.5, im->yorigin - im->ysize - 7, /* LINEOFFSET */ im->graph_col[GRC_ARROW]); + gfx_close_path(im->cr); + } @@ -2362,23 +2411,23 @@ void grid_paint( long i; int res = 0; double X0, Y0; /* points for filled graph and more */ - gfx_node_t *node; + struct gfx_color_t water_color; /* draw 3d border */ - node = gfx_new_area(im->canvas, 0, im->yimg, - 2, im->yimg - 2, 2, 2, im->graph_col[GRC_SHADEA]); - gfx_add_point(node, im->ximg - 2, 2); - gfx_add_point(node, im->ximg, 0); - gfx_add_point(node, 0, 0); -/* gfx_add_point( node , 0,im->yimg ); */ - - node = gfx_new_area(im->canvas, 2, im->yimg - 2, - im->ximg - 2, im->yimg - 2, - im->ximg - 2, 2, im->graph_col[GRC_SHADEB]); - gfx_add_point(node, im->ximg, 0); - gfx_add_point(node, im->ximg, im->yimg); - gfx_add_point(node, 0, im->yimg); -/* gfx_add_point( node , 0,im->yimg ); */ + gfx_new_area(im->cr, 0, im->yimg, + 2, im->yimg - 2, 2, 2, im->graph_col[GRC_SHADEA]); + gfx_add_point(im->cr, im->ximg - 2, 2); + gfx_add_point(im->cr, im->ximg, 0); + gfx_add_point(im->cr, 0, 0); + gfx_close_path(im->cr); + + gfx_new_area(im->cr, 2, im->yimg - 2, + im->ximg - 2, im->yimg - 2, + im->ximg - 2, 2, im->graph_col[GRC_SHADEB]); + gfx_add_point(im->cr, im->ximg, 0); + gfx_add_point(im->cr, im->ximg, im->yimg); + gfx_add_point(im->cr, 0, im->yimg); + gfx_close_path(im->cr); if (im->draw_x_grid == 1) @@ -2395,47 +2444,48 @@ void grid_paint( if (!res) { char *nodata = "No Data found"; - gfx_new_text(im->canvas, im->ximg / 2, - (2 * im->yorigin - im->ysize) / 2, - im->graph_col[GRC_FONT], - im->text_prop[TEXT_PROP_AXIS].font, - im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, - 0.0, GFX_H_CENTER, GFX_V_CENTER, nodata); + gfx_text(im->cr, im->ximg / 2, + (2 * im->yorigin - im->ysize) / 2, + im->graph_col[GRC_FONT], + im->text_prop[TEXT_PROP_AXIS].font, + im->text_prop[TEXT_PROP_AXIS].size, im->tabwidth, + 0.0, GFX_H_CENTER, GFX_V_CENTER, nodata); } } /* yaxis unit description */ - gfx_new_text(im->canvas, - 10, (im->yorigin - im->ysize / 2), - im->graph_col[GRC_FONT], - im->text_prop[TEXT_PROP_UNIT].font, - im->text_prop[TEXT_PROP_UNIT].size, im->tabwidth, - RRDGRAPH_YLEGEND_ANGLE, - GFX_H_LEFT, GFX_V_CENTER, im->ylegend); + gfx_text(im->cr, + 10, (im->yorigin - im->ysize / 2), + im->graph_col[GRC_FONT], + im->text_prop[TEXT_PROP_UNIT].font, + im->text_prop[TEXT_PROP_UNIT].size, im->tabwidth, + RRDGRAPH_YLEGEND_ANGLE, GFX_H_CENTER, GFX_V_CENTER, im->ylegend); /* graph title */ - gfx_new_text(im->canvas, - im->ximg / 2, im->text_prop[TEXT_PROP_TITLE].size * 1.3 + 4, - im->graph_col[GRC_FONT], - im->text_prop[TEXT_PROP_TITLE].font, - im->text_prop[TEXT_PROP_TITLE].size, im->tabwidth, 0.0, - GFX_H_CENTER, GFX_V_CENTER, im->title); + gfx_text(im->cr, + im->ximg / 2, 4, + im->graph_col[GRC_FONT], + im->text_prop[TEXT_PROP_TITLE].font, + im->text_prop[TEXT_PROP_TITLE].size, im->tabwidth, 0.0, + GFX_H_CENTER, GFX_V_TOP, im->title); /* rrdtool 'logo' */ - gfx_new_text(im->canvas, - im->ximg - 7, 7, - (im->graph_col[GRC_FONT] & 0xffffff00) | 0x00000044, - im->text_prop[TEXT_PROP_AXIS].font, - 5.5, im->tabwidth, 270, - GFX_H_RIGHT, GFX_V_TOP, "RRDTOOL / TOBI OETIKER"); + water_color = im->graph_col[GRC_FONT]; + water_color.alpha = 0.3; + gfx_text(im->cr, + im->ximg - 4, 7, + water_color, + im->text_prop[TEXT_PROP_AXIS].font, + 5.5, im->tabwidth, -90, + GFX_H_LEFT, GFX_V_TOP, "RRDTOOL / TOBI OETIKER"); /* graph watermark */ if (im->watermark[0] != '\0') { - gfx_new_text(im->canvas, - im->ximg / 2, im->yimg - 6, - (im->graph_col[GRC_FONT] & 0xffffff00) | 0x00000044, - im->text_prop[TEXT_PROP_AXIS].font, - 5.5, im->tabwidth, 0, - GFX_H_CENTER, GFX_V_BOTTOM, im->watermark); + gfx_text(im->cr, + im->ximg / 2, im->yimg - 6, + water_color, + im->text_prop[TEXT_PROP_AXIS].font, + 5.5, im->tabwidth, 0, + GFX_H_CENTER, GFX_V_BOTTOM, im->watermark); } /* graph labels */ @@ -2447,42 +2497,54 @@ void grid_paint( /* im->gdes[i].leg_y is the bottom of the legend */ X0 = im->gdes[i].leg_x; Y0 = im->gdes[i].leg_y; - gfx_new_text(im->canvas, X0, Y0, - im->graph_col[GRC_FONT], - im->text_prop[TEXT_PROP_LEGEND].font, - im->text_prop[TEXT_PROP_LEGEND].size, - im->tabwidth, 0.0, GFX_H_LEFT, GFX_V_BOTTOM, - im->gdes[i].legend); + gfx_text(im->cr, X0, Y0, + im->graph_col[GRC_FONT], + im->text_prop[TEXT_PROP_LEGEND].font, + im->text_prop[TEXT_PROP_LEGEND].size, + im->tabwidth, 0.0, GFX_H_LEFT, GFX_V_BOTTOM, + im->gdes[i].legend); /* The legend for GRAPH items starts with "M " to have enough space for the box */ if (im->gdes[i].gf != GF_PRINT && im->gdes[i].gf != GF_GPRINT && im->gdes[i].gf != GF_COMMENT) { int boxH, boxV; - boxH = gfx_get_text_width(im->canvas, 0, + boxH = gfx_get_text_width(im->cr, 0, im->text_prop[TEXT_PROP_LEGEND]. font, im->text_prop[TEXT_PROP_LEGEND]. - size, im->tabwidth, "o", 0) * 1.2; + size, im->tabwidth, "o") * 1.2; boxV = boxH * 1.1; + /* shift the box up a bit */ + Y0 -= boxV * 0.3; + /* make sure transparent colors show up the same way as in the graph */ - node = gfx_new_area(im->canvas, - X0, Y0 - boxV, - X0, Y0, - X0 + boxH, Y0, im->graph_col[GRC_BACK]); - gfx_add_point(node, X0 + boxH, Y0 - boxV); - - node = gfx_new_area(im->canvas, - X0, Y0 - boxV, - X0, Y0, X0 + boxH, Y0, im->gdes[i].col); - gfx_add_point(node, X0 + boxH, Y0 - boxV); - node = gfx_new_line(im->canvas, - X0, Y0 - boxV, - X0, Y0, 1.0, im->graph_col[GRC_FRAME]); - gfx_add_point(node, X0 + boxH, Y0); - gfx_add_point(node, X0 + boxH, Y0 - boxV); - gfx_close_path(node); + + gfx_new_area(im->cr, + X0, Y0 - boxV, + X0, Y0, X0 + boxH, Y0, im->graph_col[GRC_BACK]); + gfx_add_point(im->cr, X0 + boxH, Y0 - boxV); + gfx_close_path(im->cr); + + gfx_new_area(im->cr, + X0, Y0 - boxV, + X0, Y0, X0 + boxH, Y0, im->gdes[i].col); + gfx_add_point(im->cr, X0 + boxH, Y0 - boxV); + gfx_close_path(im->cr); + + gfx_line(im->cr, + X0, Y0 - boxV, + X0, Y0, 1.0, im->graph_col[GRC_FRAME]); + gfx_line(im->cr, + X0, Y0, + X0 + boxH, Y0, 1.0, im->graph_col[GRC_FRAME]); + gfx_line(im->cr, + X0 + boxH, Y0, + X0 + boxH, Y0 - boxV, 1.0, im->graph_col[GRC_FRAME]); + gfx_line(im->cr, + X0 + boxH, Y0 - boxV, + X0, Y0 - boxV, 1.0, im->graph_col[GRC_FRAME]); } } } @@ -2510,7 +2572,7 @@ int lazy_check( return 0; if ((fd = fopen(im->graphfile, "rb")) == NULL) return 0; /* the file does not exist */ - switch (im->canvas->imgformat) { + switch (im->imgformat) { case IF_PNG: size = PngSize(fd, &(im->ximg), &(im->yimg)); break; @@ -2521,67 +2583,10 @@ int lazy_check( return size; } -#ifdef WITH_PIECHART -void pie_part( - image_desc_t *im, - gfx_color_t color, - double PieCenterX, - double PieCenterY, - double Radius, - double startangle, - double endangle) -{ - gfx_node_t *node; - double angle; - double step = M_PI / 50; /* Number of iterations for the circle; - ** 10 is definitely too low, more than - ** 50 seems to be overkill - */ - - /* Strange but true: we have to work clockwise or else - ** anti aliasing nor transparency don't work. - ** - ** This test is here to make sure we do it right, also - ** this makes the for...next loop more easy to implement. - ** The return will occur if the user enters a negative number - ** (which shouldn't be done according to the specs) or if the - ** programmers do something wrong (which, as we all know, never - ** happens anyway :) - */ - if (endangle < startangle) - return; - - /* Hidden feature: Radius decreases each full circle */ - angle = startangle; - while (angle >= 2 * M_PI) { - angle -= 2 * M_PI; - Radius *= 0.8; - } - - node = gfx_new_area(im->canvas, - PieCenterX + sin(startangle) * Radius, - PieCenterY - cos(startangle) * Radius, - PieCenterX, - PieCenterY, - PieCenterX + sin(endangle) * Radius, - PieCenterY - cos(endangle) * Radius, color); - for (angle = endangle; angle - startangle >= step; angle -= step) { - gfx_add_point(node, - PieCenterX + sin(angle) * Radius, - PieCenterY - cos(angle) * Radius); - } -} - -#endif int graph_size_location( image_desc_t *im, - int elements -#ifdef WITH_PIECHART - , - int piechart -#endif - ) + int elements) { /* The actual size of the image to draw is determined from ** several sources. The size given on the command line is @@ -2590,14 +2595,7 @@ int graph_size_location( */ int Xvertical = 0, Ytitle = 0, Xylabel = 0, Xmain = 0, Ymain = 0, -#ifdef WITH_PIECHART - Xpie = 0, Ypie = 0, -#endif - Yxlabel = 0, -#if 0 - Xlegend = 0, Ylegend = 0, -#endif - Xspacing = 15, Yspacing = 15, Ywatermark = 4; + Yxlabel = 0, Xspacing = 15, Yspacing = 15, Ywatermark = 4; if (im->extra_flags & ONLY_GRAPH) { im->xorigin = 0; @@ -2646,11 +2644,10 @@ int graph_size_location( Yxlabel = im->text_prop[TEXT_PROP_AXIS].size * 2.5; } if (im->draw_y_grid || im->forceleftspace) { - Xylabel = gfx_get_text_width(im->canvas, 0, + Xylabel = gfx_get_text_width(im->cr, 0, im->text_prop[TEXT_PROP_AXIS].font, im->text_prop[TEXT_PROP_AXIS].size, - im->tabwidth, - "0", 0) * im->unitslength; + im->tabwidth, "0") * im->unitslength; } } @@ -2668,14 +2665,6 @@ int graph_size_location( im->yorigin += Ytitle; -#ifdef WITH_PIECHART - if (piechart) { - im->piesize = im->xsize < im->ysize ? im->xsize : im->ysize; - Xpie = im->piesize; - Ypie = im->piesize; - } -#endif - /* Now calculate the total size. Insert some spacing where desired. im->xorigin and im->yorigin need to correspond with the lower left corner of the main graph area or, if @@ -2687,12 +2676,6 @@ int graph_size_location( if (Xmain) Xmain -= Xspacing; /* put space between main graph area and right edge */ -#ifdef WITH_PIECHART - Xmain -= Xpie; /* remove pie width from main graph area */ - if (Xpie) - Xmain -= Xspacing; /* put space between pie and main graph area */ -#endif - im->xorigin = Xspacing + Xylabel; /* the length of the title should not influence with width of the graph @@ -2710,23 +2693,20 @@ int graph_size_location( ** of the legend and the axis labels. */ - if (im->extra_flags & NOLEGEND) - { + if (im->extra_flags & NOLEGEND) { /* set dimensions correctly if using full size mode with no legend */ - im->yorigin = im->yimg - im->text_prop[TEXT_PROP_AXIS].size * 2.5 - Yspacing; + im->yorigin = + im->yimg - im->text_prop[TEXT_PROP_AXIS].size * 2.5 - + Yspacing; Ymain = im->yorigin; - } else - { + } else { /* Determine where to place the legends onto the image. - ** Set Ymain and adjust im->yorigin to match the space requirements. - */ + ** Set Ymain and adjust im->yorigin to match the space requirements. + */ if (leg_place(im, &Ymain) == -1) - return -1; + return -1; } -#ifdef WITH_PIECHART - /* if (im->yimg < Ypie) im->yimg = Ypie; * not sure what do about this */ -#endif /* remove title space *or* some padding above the graph from the main graph area */ if (Ytitle) { @@ -2773,14 +2753,6 @@ int graph_size_location( Xmain = im->xsize; Ymain = im->ysize; } -#ifdef WITH_PIECHART - if (piechart) { - im->piesize = im->xsize < im->ysize ? im->xsize : im->ysize; - Xpie = im->piesize; - Ypie = im->piesize; - } -#endif - /* Now calculate the total size. Insert some spacing where desired. im->xorigin and im->yorigin need to correspond with the lower left corner of the main graph area or, if @@ -2794,16 +2766,8 @@ int graph_size_location( */ im->ximg = Xylabel + Xmain + 2 * Xspacing; -#ifdef WITH_PIECHART - im->ximg += Xpie; -#endif - if (Xmain) im->ximg += Xspacing; -#ifdef WITH_PIECHART - if (Xpie) - im->ximg += Xspacing; -#endif im->xorigin = Xspacing + Xylabel; @@ -2830,10 +2794,6 @@ int graph_size_location( im->yimg = Ymain + Yxlabel; -#ifdef WITH_PIECHART - if (im->yimg < Ypie) - im->yimg = Ypie; -#endif im->yorigin = im->yimg - Yxlabel; @@ -2859,27 +2819,6 @@ int graph_size_location( } } -#if 0 - if (Xlegend > im->ximg) { - im->ximg = Xlegend; - /* reposition Pie */ - } -#endif - -#ifdef WITH_PIECHART - /* The pie is placed in the upper right hand corner, - ** just below the title (if any) and with sufficient - ** padding. - */ - if (elements) { - im->pie_x = im->ximg - Xspacing - Xpie / 2; - im->pie_y = im->yorigin - Ymain + Ypie / 2; - } else { - im->pie_x = im->ximg / 2; - im->pie_y = im->yorigin - Ypie / 2; - } -#endif - ytr(im, DNAN); return 0; } @@ -2897,14 +2836,9 @@ int graph_paint( int i, ii; int lazy = lazy_check(im); -#ifdef WITH_PIECHART - int piechart = 0; - double PieStart = 0.0; -#endif - FILE *fo; - gfx_node_t *node; - double areazero = 0.0; + PangoFontMap *font_map = pango_cairo_font_map_get_default(); + graph_desc_t *lastgdes = NULL; /* if we are lazy and there is nothing to PRINT ... quit now */ @@ -2920,15 +2854,6 @@ int graph_paint( if (data_calc(im) == -1) return -1; -#ifdef WITH_PIECHART - /* check if we need to draw a piechart */ - for (i = 0; i < im->gdes_c; i++) { - if (im->gdes[i].gf == GF_PART) { - piechart = 1; - break; - } - } -#endif /* calculate and PRINT and GPRINT definitions. We have to do it at * this point because it will affect the length of the legends @@ -2938,28 +2863,14 @@ int graph_paint( i = print_calc(im, calcpr); if (i < 0) return -1; - if (((i == 0) -#ifdef WITH_PIECHART - && (piechart == 0) -#endif - ) || lazy) + if ((i == 0) || lazy) return 0; -#ifdef WITH_PIECHART - /* If there's only the pie chart to draw, signal this */ - if (i == 0) - piechart = 2; -#endif - /************************************************************** *** Calculating sizes and locations became a bit confusing *** *** so I moved this into a separate function. *** **************************************************************/ - if (graph_size_location(im, i -#ifdef WITH_PIECHART - , piechart -#endif - ) == -1) + if (graph_size_location(im, i) == -1) return -1; /* get actual drawing data and find min and max values */ @@ -2982,39 +2893,57 @@ int graph_paint( /* the actual graph is created by going through the individual graph elements and then drawing them */ + cairo_surface_destroy(im->surface); - node = gfx_new_area(im->canvas, - 0, 0, - 0, im->yimg, - im->ximg, im->yimg, im->graph_col[GRC_BACK]); + switch (im->imgformat) { + case IF_PNG: + im->surface = + cairo_image_surface_create(CAIRO_FORMAT_ARGB32, + im->ximg * im->zoom, + im->yimg * im->zoom); + break; + case IF_PDF: + im->surface = + cairo_pdf_surface_create(im->graphfile, im->ximg * im->zoom, + im->yimg * im->zoom); + break; + case IF_EPS: + im->surface = + cairo_ps_surface_create(im->graphfile, im->ximg * im->zoom, + im->yimg * im->zoom); + break; + case IF_SVG: + im->surface = + cairo_svg_surface_create(im->graphfile, im->ximg * im->zoom, + im->yimg * im->zoom); + cairo_svg_surface_restrict_to_version(im->surface, + CAIRO_SVG_VERSION_1_1); + break; + }; + im->cr = cairo_create(im->surface); + pango_cairo_font_map_set_resolution(font_map, 100); + cairo_scale(im->cr, im->zoom, im->zoom); - gfx_add_point(node, im->ximg, 0); + gfx_new_area(im->cr, + 0, 0, + 0, im->yimg, im->ximg, im->yimg, im->graph_col[GRC_BACK]); -#ifdef WITH_PIECHART - if (piechart != 2) { -#endif - node = gfx_new_area(im->canvas, - im->xorigin, im->yorigin, - im->xorigin + im->xsize, im->yorigin, - im->xorigin + im->xsize, im->yorigin - im->ysize, - im->graph_col[GRC_CANVAS]); - - gfx_add_point(node, im->xorigin, im->yorigin - im->ysize); - - if (im->minval > 0.0) - areazero = im->minval; - if (im->maxval < 0.0) - areazero = im->maxval; -#ifdef WITH_PIECHART - } -#endif + gfx_add_point(im->cr, im->ximg, 0); + gfx_close_path(im->cr); -#ifdef WITH_PIECHART - if (piechart) { - pie_part(im, im->graph_col[GRC_CANVAS], im->pie_x, im->pie_y, - im->piesize * 0.5, 0, 2 * M_PI); - } -#endif + gfx_new_area(im->cr, + im->xorigin, im->yorigin, + im->xorigin + im->xsize, im->yorigin, + im->xorigin + im->xsize, im->yorigin - im->ysize, + im->graph_col[GRC_CANVAS]); + + gfx_add_point(im->cr, im->xorigin, im->yorigin - im->ysize); + gfx_close_path(im->cr); + + if (im->minval > 0.0) + areazero = im->minval; + if (im->maxval < 0.0) + areazero = im->maxval; for (i = 0; i < im->gdes_c; i++) { switch (im->gdes[i].gf) { @@ -3034,20 +2963,20 @@ int graph_paint( if (!isnan(im->gdes[i].p_data[ii]) && im->gdes[i].p_data[ii] != 0.0) { if (im->gdes[i].yrule > 0) { - gfx_new_line(im->canvas, - im->xorigin + ii, im->yorigin, - im->xorigin + ii, - im->yorigin - - im->gdes[i].yrule * im->ysize, 1.0, - im->gdes[i].col); + gfx_line(im->cr, + im->xorigin + ii, im->yorigin, + im->xorigin + ii, + im->yorigin - + im->gdes[i].yrule * im->ysize, 1.0, + im->gdes[i].col); } else if (im->gdes[i].yrule < 0) { - gfx_new_line(im->canvas, - im->xorigin + ii, - im->yorigin - im->ysize, - im->xorigin + ii, - im->yorigin - (1 - - im->gdes[i].yrule) * - im->ysize, 1.0, im->gdes[i].col); + gfx_line(im->cr, + im->xorigin + ii, + im->yorigin - im->ysize, + im->xorigin + ii, + im->yorigin - (1 - + im->gdes[i].yrule) * + im->ysize, 1.0, im->gdes[i].col); } } @@ -3078,52 +3007,74 @@ int graph_paint( we draw a square from t-1 to t with the value a. ********************************************************* */ - if (im->gdes[i].col != 0x0) { + if (im->gdes[i].col.alpha != 0.0) { /* GF_LINE and friend */ if (im->gdes[i].gf == GF_LINE) { double last_y = 0.0; + int draw_on = 0; - node = NULL; + cairo_save(im->cr); + cairo_new_path(im->cr); + + cairo_set_line_width(im->cr, im->gdes[i].linewidth); for (ii = 1; ii < im->xsize; ii++) { if (isnan(im->gdes[i].p_data[ii]) || (im->slopemode == 1 && isnan(im->gdes[i].p_data[ii - 1]))) { - node = NULL; + draw_on = 0; continue; } - if (node == NULL) { + if (draw_on == 0) { last_y = ytr(im, im->gdes[i].p_data[ii]); if (im->slopemode == 0) { - node = gfx_new_line(im->canvas, - ii - 1 + im->xorigin, - last_y, ii + im->xorigin, - last_y, - im->gdes[i].linewidth, - im->gdes[i].col); + double x = ii - 1 + im->xorigin; + double y = last_y; + + gfx_line_fit(im->cr, &x, &y); + cairo_move_to(im->cr, x, y); + x = ii + im->xorigin; + y = last_y; + gfx_line_fit(im->cr, &x, &y); + cairo_line_to(im->cr, x, y); } else { - node = gfx_new_line(im->canvas, - ii - 1 + im->xorigin, - ytr(im, - im->gdes[i]. - p_data[ii - 1]), - ii + im->xorigin, last_y, - im->gdes[i].linewidth, - im->gdes[i].col); + double x = ii - 1 + im->xorigin; + double y = ytr(im, + im->gdes[i].p_data[ii - 1]); + + gfx_line_fit(im->cr, &x, &y); + cairo_move_to(im->cr, x, y); + x = ii + im->xorigin; + y = last_y; + gfx_line_fit(im->cr, &x, &y); + cairo_line_to(im->cr, x, y); } + draw_on = 1; } else { - double new_y = ytr(im, im->gdes[i].p_data[ii]); + double x1 = ii + im->xorigin; + double y1 = ytr(im, im->gdes[i].p_data[ii]); if (im->slopemode == 0 - && !AlmostEqual2sComplement(new_y, last_y, - 4)) { - gfx_add_point(node, ii - 1 + im->xorigin, - new_y); + && !AlmostEqual2sComplement(y1, last_y, 4)) { + double x = ii - 1 + im->xorigin; + double y = y1; + + gfx_line_fit(im->cr, &x, &y); + cairo_line_to(im->cr, x, y); }; - last_y = new_y; - gfx_add_point(node, ii + im->xorigin, new_y); + last_y = y1; + gfx_line_fit(im->cr, &x1, &y1); + cairo_line_to(im->cr, x1, y1); }; } + cairo_set_source_rgba(im->cr, im->gdes[i].col.red, + im->gdes[i].col.green, + im->gdes[i].col.blue, + im->gdes[i].col.alpha); + cairo_set_line_cap(im->cr, CAIRO_LINE_CAP_ROUND); + cairo_set_line_join(im->cr, CAIRO_LINE_JOIN_ROUND); + cairo_stroke(im->cr); + cairo_restore(im->cr); } else { int idxI = -1; double *foreY = malloc(sizeof(double) * im->xsize * 2); @@ -3147,11 +3098,11 @@ int graph_paint( 4)) { cntI++; } - node = gfx_new_area(im->canvas, - backX[0], backY[0], - foreX[0], foreY[0], - foreX[cntI], foreY[cntI], - im->gdes[i].col); + gfx_new_area(im->cr, + backX[0], backY[0], + foreX[0], foreY[0], + foreX[cntI], foreY[cntI], + im->gdes[i].col); while (cntI < idxI) { lastI = cntI; cntI++; @@ -3165,9 +3116,10 @@ int graph_paint( 1], 4)) { cntI++; } - gfx_add_point(node, foreX[cntI], foreY[cntI]); + gfx_add_point(im->cr, foreX[cntI], + foreY[cntI]); } - gfx_add_point(node, backX[idxI], backY[idxI]); + gfx_add_point(im->cr, backX[idxI], backY[idxI]); while (idxI > 1) { lastI = idxI; idxI--; @@ -3181,10 +3133,12 @@ int graph_paint( 1], 4)) { idxI--; } - gfx_add_point(node, backX[idxI], backY[idxI]); + gfx_add_point(im->cr, backX[idxI], + backY[idxI]); } idxI = -1; drawem = 0; + gfx_close_path(im->cr); } if (drawem != 0) { drawem = 0; @@ -3193,10 +3147,6 @@ int graph_paint( if (ii == im->xsize) break; - /* keep things simple for now, just draw these bars - do not try to build a big and complex area */ - - if (im->slopemode == 0 && ii == 0) { continue; } @@ -3214,8 +3164,7 @@ int graph_paint( drawem = 1; continue; } - /* every area has to be wound clock-wise, - so we have to make sur base remains base */ + if (ybase > ytop) { double extra = ytop; @@ -3253,20 +3202,6 @@ int graph_paint( } lastgdes = &(im->gdes[i]); break; -#ifdef WITH_PIECHART - case GF_PART: - if (isnan(im->gdes[i].yrule)) /* fetch variable */ - im->gdes[i].yrule = im->gdes[im->gdes[i].vidx].vf.val; - - if (finite(im->gdes[i].yrule)) { /* even the fetched var can be NaN */ - pie_part(im, im->gdes[i].col, - im->pie_x, im->pie_y, im->piesize * 0.4, - M_PI * 2.0 * PieStart / 100.0, - M_PI * 2.0 * (PieStart + im->gdes[i].yrule) / 100.0); - PieStart += im->gdes[i].yrule; - } - break; -#endif case GF_STACK: rrd_set_error ("STACK should already be turned into LINE or AREA here"); @@ -3275,13 +3210,6 @@ int graph_paint( } /* switch */ } -#ifdef WITH_PIECHART - if (piechart == 2) { - im->draw_x_grid = 0; - im->draw_y_grid = 0; - } -#endif - /* grid_paint also does the text */ if (!(im->extra_flags & ONLY_GRAPH)) @@ -3298,19 +3226,19 @@ int graph_paint( case GF_HRULE: if (im->gdes[i].yrule >= im->minval && im->gdes[i].yrule <= im->maxval) - gfx_new_line(im->canvas, - im->xorigin, ytr(im, im->gdes[i].yrule), - im->xorigin + im->xsize, ytr(im, - im->gdes[i].yrule), - 1.0, im->gdes[i].col); + gfx_line(im->cr, + im->xorigin, ytr(im, im->gdes[i].yrule), + im->xorigin + im->xsize, ytr(im, + im->gdes[i].yrule), + 1.0, im->gdes[i].col); break; case GF_VRULE: if (im->gdes[i].xrule >= im->start && im->gdes[i].xrule <= im->end) - gfx_new_line(im->canvas, - xtr(im, im->gdes[i].xrule), im->yorigin, - xtr(im, im->gdes[i].xrule), - im->yorigin - im->ysize, 1.0, im->gdes[i].col); + gfx_line(im->cr, + xtr(im, im->gdes[i].xrule), im->yorigin, + xtr(im, im->gdes[i].xrule), + im->yorigin - im->ysize, 1.0, im->gdes[i].col); break; default: break; @@ -3318,22 +3246,18 @@ int graph_paint( } - if (strcmp(im->graphfile, "-") == 0) { - fo = im->graphhandle ? im->graphhandle : stdout; -#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__CYGWIN32__) - /* Change translation mode for stdout to BINARY */ - _setmode(_fileno(fo), O_BINARY); -#endif - } else { - if ((fo = fopen(im->graphfile, "wb")) == NULL) { - rrd_set_error("Opening '%s' for write: %s", im->graphfile, - rrd_strerror(errno)); - return (-1); + switch (im->imgformat) { + case IF_PNG: + if (cairo_surface_write_to_png(im->surface, im->graphfile) != + CAIRO_STATUS_SUCCESS) { + rrd_set_error("Could not save png to '%s'", im->graphfile); + return 1; } + break; + default: + cairo_show_page(im->cr); + break; } - gfx_render(im->canvas, im->ximg, im->yimg, 0x00000000, fo); - if (strcmp(im->graphfile, "-") != 0) - fclose(fo); return 0; } @@ -3370,8 +3294,11 @@ int gdes_alloc( im->gdes[im->gdes_c - 1].data_first = 0; im->gdes[im->gdes_c - 1].p_data = NULL; im->gdes[im->gdes_c - 1].rpnp = NULL; - im->gdes[im->gdes_c - 1].shift = 0; - im->gdes[im->gdes_c - 1].col = 0x0; + im->gdes[im->gdes_c - 1].shift = 0.0; + im->gdes[im->gdes_c - 1].col.red = 0.0; + im->gdes[im->gdes_c - 1].col.green = 0.0; + im->gdes[im->gdes_c - 1].col.blue = 0.0; + im->gdes[im->gdes_c - 1].col.alpha = 0.0; im->gdes[im->gdes_c - 1].legend[0] = '\0'; im->gdes[im->gdes_c - 1].format[0] = '\0'; im->gdes[im->gdes_c - 1].strftm = 0; @@ -3426,6 +3353,13 @@ int rrd_graph( image_desc_t im; rrd_graph_init(&im); + + /* a dummy surface so that we can measure text sizes for placements */ + im.surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 10); + im.cr = cairo_create(im.surface); + + + /* not currently using this ... */ im.graphhandle = stream; rrd_graph_options(argc, argv, &im); @@ -3489,8 +3423,7 @@ int rrd_graph( } sprintf((*prdata)[0], im.imginfo, filename, - (long) (im.canvas->zoom * im.ximg), - (long) (im.canvas->zoom * im.yimg)); + (long) (im.zoom * im.ximg), (long) (im.zoom * im.yimg)); } im_free(&im); return 0; @@ -3529,6 +3462,9 @@ void rrd_graph_init( im->forceleftspace = 0; im->symbol = ' '; im->viewfactor = 1.0; + im->imgformat = IF_PNG; + im->cr = NULL; + im->surface = NULL; im->extra_flags = 0; im->rigid = 0; im->gridfit = 1; @@ -3543,10 +3479,10 @@ void rrd_graph_init( im->prt_c = 0; im->gdes_c = 0; im->gdes = NULL; - im->canvas = gfx_new_canvas(); im->grid_dash_on = 1; im->grid_dash_off = 1; im->tabwidth = 40.0; + im->zoom = 1; for (i = 0; i < DIM(graph_col); i++) im->graph_col[i] = graph_col[i]; @@ -3600,7 +3536,7 @@ void rrd_graph_options( time_t start_tmp = 0, end_tmp = 0; long long_tmp; struct rrd_time_value start_tv, end_tv; - gfx_color_t color; + long unsigned int color; optind = 0; opterr = 0; /* initialize getopt */ @@ -3827,7 +3763,7 @@ void rrd_graph_options( im->extra_flags |= FULL_SIZE_MODE; break; case 'i': - im->canvas->interlaced = 1; + /* interlaced png not supported at the moment */ break; case 'r': im->rigid = 1; @@ -3836,7 +3772,7 @@ void rrd_graph_options( im->imginfo = optarg; break; case 'a': - if ((int) (im->canvas->imgformat = if_conv(optarg)) == -1) { + if ((int) (im->imgformat = if_conv(optarg)) == -1) { rrd_set_error("unsupported graphics format '%s'", optarg); return; } @@ -3881,7 +3817,7 @@ void rrd_graph_options( return; } if ((ci = grc_conv(col_nam)) != -1) { - im->graph_col[ci] = color; + im->graph_col[ci] = gfx_hex_to_col(color); } else { rrd_set_error("invalid color name '%s'", col_nam); return; @@ -3922,8 +3858,8 @@ void rrd_graph_options( break; } case 'm': - im->canvas->zoom = atof(optarg); - if (im->canvas->zoom <= 0.0) { + im->zoom = atof(optarg); + if (im->zoom <= 0.0) { rrd_set_error("zoom factor must be > 0"); return; } @@ -3934,20 +3870,11 @@ void rrd_graph_options( break; case 'R': - if (strcmp(optarg, "normal") == 0) - im->canvas->aa_type = AA_NORMAL; - else if (strcmp(optarg, "light") == 0) - im->canvas->aa_type = AA_LIGHT; - else if (strcmp(optarg, "mono") == 0) - im->canvas->aa_type = AA_NONE; - else { - rrd_set_error("unknown font-render-mode '%s'", optarg); - return; - } + /* not supported curently */ break; case 'B': - im->canvas->font_aa_threshold = atof(optarg); + /* not supported curently */ break; case 'W': @@ -4016,7 +3943,7 @@ int rrd_graph_color( } else { int n = 0; char *rest; - gfx_color_t col; + long unsigned int col; rest = strstr(color, ":"); if (rest != NULL) @@ -4040,7 +3967,7 @@ int rrd_graph_color( } if (rrd_test_error()) return 0; - gdp->col = col; + gdp->col = gfx_hex_to_col(col); return n; } } diff --git a/program/src/rrd_graph.h b/program/src/rrd_graph.h index 2c9309be..dd036151 100644 --- a/program/src/rrd_graph.h +++ b/program/src/rrd_graph.h @@ -101,7 +101,6 @@ typedef struct ylab_t { int lfac[4]; /* associated label spacing */ } ylab_t; - /* this structure describes the elements which can make up a graph. because they are quite diverse, not all elements will use all the possible parts of the structure. */ @@ -122,7 +121,7 @@ typedef struct graph_desc_t { long ds; /* data source number */ enum cf_en cf; /* consolidation function */ enum cf_en cf_reduce; /* consolidation function for reduce_data() */ - gfx_color_t col; /* graph color */ + struct gfx_color_t col; /* graph color */ char format[FMT_LEG_LEN + 5]; /* format for PRINT AND GPRINT */ char legend[FMT_LEG_LEN + 5]; /* legend */ int strftm; /* should the VDEF legend be formated with strftime */ @@ -160,7 +159,7 @@ typedef struct image_desc_t { #ifdef WITH_PIECHART long piesize; /* size of the piechart */ #endif - gfx_color_t graph_col[__GRC_END__]; /* real colors for the graph */ + struct gfx_color_t graph_col[__GRC_END__]; /* real colors for the graph */ text_prop_t text_prop[TEXT_PROP_LAST]; /* text properties */ char ylegend[210]; /* legend along the yaxis */ char title[210]; /* title for graph */ @@ -184,6 +183,7 @@ typedef struct image_desc_t { grindlines falls in integer pixel values */ char *imginfo; /* construct an col = r << 24 | g << 16 | b << 8 | a; + gdp->col = gfx_hex_to_col(r << 24 | g << 16 | b << 8 | a); return 0; } @@ -497,23 +497,22 @@ int rrd_parse_PVHLAST( static int spacecnt = 0; if (spacecnt == 0) { - float one_space = gfx_get_text_width(im->canvas, 0, + float one_space = gfx_get_text_width(im->cr, 0, im-> text_prop[TEXT_PROP_LEGEND]. font, im-> text_prop[TEXT_PROP_LEGEND]. size, - im->tabwidth, " ", - 0) / 4.0; - float target_space = gfx_get_text_width(im->canvas, 0, + im->tabwidth, " ") / 4.0; + float target_space = gfx_get_text_width(im->cr, 0, im-> text_prop [TEXT_PROP_LEGEND].font, im-> text_prop [TEXT_PROP_LEGEND].size, - im->tabwidth, "oo", 0); + im->tabwidth, "oo"); spacecnt = target_space / one_space; dprintf("- spacecnt: %i onespace: %f targspace: %f\n", spacecnt, @@ -607,7 +606,8 @@ int rrd_parse_PVHLAST( rrd_set_error("Could not parse color in '%s'", &tmpstr[j]); return 1; } - dprintf("- parsed color 0x%08x\n", (unsigned int) gdp->col); + dprintf("- parsed color %0.0f,%0.0f,%0.0f,%0.0f\n", gdp->col.red, + gdp->col.green, gdp->col.blue, gdp->col.alpha); colorfound = 1; } else { dprintf("- no color present in '%s'\n", tmpstr); -- 2.30.2